【问题标题】:can I have the PATH variable evaluate to what directory I'm in?我可以让 PATH 变量评估我所在的目录吗?
【发布时间】:2013-02-14 20:18:25
【问题描述】:

linux 上使用bash
假设我做了两个程序,都叫print_report
(它们位于不同的目录中。)

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

PATH="path/to/print_report1/:$PATH"

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


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

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

【问题讨论】:

    标签: bash shell path command-line-interface


    【解决方案1】:

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

    #!/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
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

        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 中定义它。)

        【讨论】:

        • 虚拟 +1 提醒安全隐患
        【解决方案4】:

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

        report:
                /bin/foo/print_report
        

        ~/project1/Makefile,和

        report:
                /bin/bar/print_report
        

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

        【讨论】:

          猜你喜欢
          • 2018-03-05
          • 1970-01-01
          • 2013-07-22
          • 1970-01-01
          • 1970-01-01
          • 2015-04-03
          • 2019-04-24
          • 2011-05-31
          • 1970-01-01
          相关资源
          最近更新 更多