我正在尝试设置一个找到bash位置的脚本,然后在shabang中使用它,我没有使用env
,因为我读过的示例脚本使用符号链接{{1如果它不在env
中,那么为什么我可以使用usr/bin
查找which
然后设置链接呢?
我遇到的问题是如果找不到命令则比较bash
的返回值(-1)
编辑:我看过手册错误which
只返回-1,如果没有发送agrs
但-1是换行符,当我比较它是真的时,我得到的错误是我将字符串which
与数字-1进行比较
我尝试了几种不同的方法,但无法弄清楚如何让它发挥作用
/bin/bash
答案 0 :(得分:3)
我正在尝试设置一个脚本,找到bash的位置然后使用 它在shabang
你做不到。现在发生的事情是你的脚本默认是由shell运行的。如果不是,你如何使用shell来获取脚本中shell的位置?即使你将它重命名为“script.blah”并删除任何shebang,只要它是可执行的并且包含shell命令,shell就会运行它。
如果你在页面的中间放置一个shebang,它不会有任何意义 - 它只是一个评论。如果shebang是shebang,#!
需要文件中的前两个字符。这是告诉shell传递给任何东西;如果它没有找到,那么它假设它是一个shell脚本。如果您想在此之后调用其他shell或解释器,则必须按照与命令行相同的方式执行此操作。
答案 1 :(得分:2)
不仅没有理由做你正在做的事情,试图检测shell的位置假设脚本已经在shell中运行。
无论你读到什么env
都是错的。没有理由期望它是一个符号链接。人们在shebang中使用env
因为在env
下找到/usr/bin
而不是在Bash
下找到/bin
的可能性略高,但很多人没有甚至打扰了。大概是你跳过这样的箍的原因是为了便于携带,在这种情况下which
是一个非常糟糕和非标准的选择。相反,请使用type
或ksh whence
。例如:
if x=$(type -p bash); then
"$x" myscript
else
echo "Not found" >&2
fi
不幸的是,type
所做的确实甚至都没有很好地标准化。只需执行命令,shell将执行其操作或抛出错误。只有在不常见的情况下才需要检查是否存在命令。
答案 2 :(得分:1)
您可以使用$?
来引用上次运行进程的返回值。例如:
name=$(which bash)
if [[ $? == 0 ]];
then echo "found";
fi
在你的问题中,你似乎认为错误总是-1。一般情况下,这不是真的。程序将向shell返回非零错误代码。因此0成功,任何其他值(包括-1)都是失败。
答案 3 :(得分:1)
你可以运行
which bash && found=true
发现只会在成功终止时设置(即,如果找到)