/usr/bin/foo
我和其他脚本使用了一个可执行文件,但是它的行为有点问题,因此我在/usr/local/bin/foo
修复其行为错误的地方制作了一个相同文件名的Bash包装器。我PATH
是/usr/local/bin:/usr/bin
。在包装脚本中,我必须通过绝对路径运行原始可执行文件,以免陷入无限循环:
$ cat /usr/local/bin/foo
#/bin/zsh
/usr/bin/foo | grep -v "^INFO" # stfu, really
是否有任何(岩组或击特定也许)接下来执行简单的方法foo
中PATH
,那就是foo
这是在PATH
是从当前的目录后的目录foo
中执行,这样我就不必使用绝对路径原来的可执行文件?
我可以为此编写一个函数,这/etc/zshenv
没什么大不了的。我只是想知道是否有任何标准。我不想使用别名或修复原始可执行文件。
$ cat /usr/local/bin/foo
#/bin/zsh
path=(${path/#%$0:A:h}) foo | grep -v "^INFO" # stfu, really
这应该清空(但保留)PATH ()中与当前可执行文件()的绝对目录()${path/...}
完全匹配(#%
)的所有字符串。TBH,我是从StackExchange组装而成的,但还不太了解。我希望它不会咬我。:A
:h
$0
$ cat /usr/local/bin/foo
#/bin/zsh
path[${path[(i)$0:A:h]}]=() foo | grep -v "^INFO" # stfu, really
$path[(i)foo]
查找foo
数组中的索引path
或数组的长度加1。
您可以找出脚本所在的目录($0:h
在zsh中,"${0%/*}"
在sh中),然后从PATH
(path=(${path:#$0:h})
在zsh中,在sh中更复杂)删除该目录。如果PATH
两次包含相同的目录(例如通过符号链接),则可能会失败。
直接方法的缺点是,这会将目录从路径中删除,但是可能希望使用同一目录中的其他程序。您可以通过仅使用修改后的路径进行路径查找来解决此问题。
next=$(path=(${path:#$0:h}); print -lr -- =$0:t)
$next
取而代之的是,我将PATH
手动进行查找,并跳过所有正在运行的脚本。
for d in $path; do
if [[ -x $d/$0:t && ! $d/$0:t -ef $0 ]]; then
exec $d/$0:t
fi
done
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句