Bash 单行代码可以临时附加链接命令的路径,而无需额外的 bash 调用?

Bash 单行代码可以临时附加链接命令的路径,而无需额外的 bash 调用?

考虑一下:

$ 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

相关内容