0

linux使用bash时,
假设我制作了两个程序都称为print_report.
(它们位于不同的目录中。)

在我的.bashrc文件中,我有:

PATH="路径/到/print_report1/:$PATH"

这使我可以print_report在任何地方键入,它将运行其中一个程序。


如何让 bash 根据工作目录决定使用其中一个或另一个?

例如,
如果我当前在~/project1/并键入print_report它将使用/bin/foo/print_report
如果我当前在~/project2/并键入print_report它将使用/bin/bar/print_report

4

4 回答 4

4

你不能那样做。相反,编写一个包装脚本或函数来检查当前目录并调用正确的命令:

#!/bin/bash
if [[ $PWD == $HOME/project1/* ]]
then
    /bin/foo/print_report "$@"
elif [[ $PWD == $HOME/project2/* ]] 
then
    /bin/bar/print_report "$@"
else
    echo "Don't know how to print_report for $PWD"
fi
于 2013-02-14T20:25:05.350 回答
1

这是一场等待发生的安全灾难,(也就是说你真的不想这样做),但你当然可以这样做:

cd() {
    dir=${1-.}
    case $dir in)
        path1) PATH=/path/for/working/in/path1;;
        path2) PATH=/path/for/working/in/path2;;
        *) PATH=/bin:/usr/bin;;
    esac
    command cd $dir
}

(把它放在你的 .bashrc 中,或者只是在当前的 shell 中定义它。)

于 2013-02-14T20:25:13.133 回答
1

您可以使用 DEBUG 陷阱模拟preexec hooks à la zsh。

这样,每次执行命令时,您都可以运行 preexec hook 来检查 $PWD,并相应地调整 $PATH。

你可以在你的 .bashrc 中包含一个 preexec 钩子来做你想做的事情。

于 2013-02-14T20:25:59.990 回答
0

到目前为止,这里介绍的所有内容都让我觉得过于复杂和不必要的复杂骇客。我会Makefile在每个目录中放置一个

report:
        /bin/foo/print_report

~/project1/Makefile, 和

report:
        /bin/bar/print_report

~/project2/Makefile. 这很容易扩展到您想要的任意数量的目录和程序。而且您只需要键入make而不是那些冗长的命令名称:-)

于 2013-02-15T18:03:48.323 回答