可执行文件包装程序,从PATH的末尾运行原始可执行文件

怪异的

/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

是否有任何(岩组或击特定也许)接下来执行简单的方法fooPATH,那就是foo这是在PATH是从当前的目录后的目录foo中执行,这样我就不必使用绝对路径原来的可执行文件?

我可以为此编写一个函数,这/etc/zshenv没什么大不了的。我只是想知道是否有任何标准。我不想使用别名或修复原始可执行文件。


编辑1:

$ 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

编辑2:

$ 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中),然后从PATHpath=(${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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章