考虑一下:
$ cd /tmp
$ echo "echo YES" >> prog/myprog
$ chmod +x prog/myprog
$ prog/myprog
YES
$ myprog
myprog: command not found
我可以暂时修改PATH
为按名称调用myprog
,如下所示:
$ PATH="$PATH":$(readlink -f prog) myprog
YES
...但是我无法用这种方法链接命令:
$ PATH="$PATH":$(readlink -f prog) myprog && myprog
YES
myprog: command not found
...显然修改后的内容PATH
显然没有传播到第二次调用。
我知道我可以这样做:
$ PATH="$PATH":$(readlink -f prog) bash -c "myprog && myprog"
YES
YES
...但随后我必须调用一个额外的bash
过程 - 更糟糕的是,我必须引用。
有没有什么方法可以临时附加到 PATH 以用于单行中的链接命令,而不必调用 extrabash
和 quote?尝试了反引号,它们不起作用:
$ PATH="$PATH":$(readlink -f prog) `myprog && myprog`
myprog: command not found
答案1
使用子 shell 怎么样:
$ (PATH="$PATH:$(readlink -f prog)"; myprog && myprog)
YES
YES
答案2
这取决于您认为“暂时”的情况。例如,您可以运行:
$ PATH="$PATH":$(readlink -f prog)
然后您就可以myprog
尽情地完成剩下的 shell 会话了。您所做的更改PATH
将在您注销后立即消失。您可以打开一个新终端(如果以图形方式工作),或者切换到不同的 tty(如果不是),或者运行一个新会话:
$ bash
$ PATH="$PATH":$(readlink -f prog)
## Do your stuff here
$ exit
运行同样的事情的另一种方法是:
PATH="$PATH":$(readlink -f prog) bash
这将启动一个新的 bash 会话,并更改 PATH 变量。完成后,立即跑回exit
父母身边。
答案3
如果您希望仅在命令执行期间更改路径。
然后,您需要在每次调用该命令时进行设置。
这对于别名来说是一个完美的工作:
alias myprog='PATH="$PATH":$(readlink -f prog) myprog'
用于:
$ myprog && myprog
YES
YES
当然,同名的函数也会不是工作:
$ myprog(){ PATH="$PATH":$(readlink -f prog) myprog; } ### DO NOT USE !!
我只是想知道你是否真的需要这些。如果您在内部创建脚本~/bin
(在创建目录后登录~/bin
),PATH
变量将已经包含该路径,并且只需命名即可执行脚本:
$ cd ~/bin ### create the dir if it didn't exist.
$ echo "echo YES" >> myprog
$ chmod u+x myprog
$ cd ~
$ myprog ### remember to reload ~/.bashrc (re-login).
YES