Bash 在脚本中,如何将'which'的返回值与-1进行比较?

Bash 在脚本中,如何将'which'的返回值与-1进行比较?,bash,Bash,我试图设置一个脚本,找到bash的位置,然后在沙邦中使用它,我没有使用env,因为我阅读的示例脚本说,如果它不在usr/bin中,那么为什么要使用which来查找bash,然后设置到它的链接呢? 我遇到的问题是,如果没有找到命令(-1),比较的返回值 编辑:我错误地阅读了手册,如果没有向手册发送AGR,手册只会返回-1 但是-1是一个换行符,当我比较它为真时,我得到一个错误,我将字符串/bin/bash与数字-1进行比较 我试过几种不同的方法,但不知道如何让它发挥作用 newname=$(whi

我试图设置一个脚本,找到bash的位置,然后在沙邦中使用它,我没有使用
env
,因为我阅读的示例脚本说,如果它不在
usr/bin
中,那么为什么要使用
which
来查找
bash
,然后设置到它的链接呢? 我遇到的问题是,如果没有找到命令(-1),比较
的返回值
编辑:我错误地阅读了手册
,如果没有向手册发送AGR,手册只会返回-1

但是-1是一个换行符,当我比较它为真时,我得到一个错误,我将字符串
/bin/bash
与数字-1进行比较

我试过几种不同的方法,但不知道如何让它发挥作用

newname=$(which bash)
echo $newname
fault=-1
if [ "$newname" = fault ] ; then
echo couldn\'t find bash shell
else
#! newname

您可以使用
$?
引用上次运行进程的返回值。例如:

name=$(which bash)
if [[ $? == 0 ]]; 
    then echo "found"; 
fi
if x=$(type -p bash); then
    "$x" myscript
else
    echo "Not found" >&2
fi
注 在你的问题中,你似乎假设错误总是-1。一般来说,这不是真的。程序将向shell返回非零错误代码。因此,0表示成功,而任何其他值(包括-1)都表示失败

我试图设置一个脚本,找到bash然后使用的位置 它在沙邦

你不能那样做。现在的情况是,默认情况下,您的脚本由shell运行。如果不是,您如何使用shell在脚本中获取shell的位置?即使您将其重命名为“script.blah”并删除任何shebang,只要它是可执行的并且包含shell命令,shell就会运行它

如果你在页面的一半位置放置一个shebang,它不会有任何意义——它只是一个注释。一个shebang就是shebang,
#必须是文件中的前两个字符。这是告诉炮弹传递给任何东西;如果找不到,则假定它是一个shell脚本。如果您想在此之后调用其他shell或解释器,则必须以与在命令行上相同的方式执行此操作。

您可以运行

which bash && found=true

Found仅在成功终止时设置(即,如果找到它)

不仅完全没有理由执行您正在执行的操作,而且尝试检测shell的位置时假定脚本已在shell中运行

无论你读到什么关于
env
都是错误的。没有理由期望它是一个符号链接。人们在shebang中使用
env
,因为在
/usr/bin
下找到
env
的几率比在
/bin
下找到
Bash
的几率稍大一些,但许多人甚至不为此烦恼。想必,你之所以这样做是为了便于携带,在这种情况下,
which
是一个非常糟糕和不标准的选择。相反,请使用
类型
,或在ksh中使用
where
。例如:

name=$(which bash)
if [[ $? == 0 ]]; 
    then echo "found"; 
fi
if x=$(type -p bash); then
    "$x" myscript
else
    echo "Not found" >&2
fi

不幸的是,
类型
所做的事情也没有很好的标准化。只要执行这些命令,shell就会完成它的任务或者抛出一个错误。只有在不常见的情况下才需要检查命令是否存在。

我已经尝试过了,但是感谢我阅读了该手册中的错误注释wrong@UNECS你的问题有点奇怪。标题询问“如何比较其返回值…”。我将其解释为进程“which”的返回值。这就是我的回答。你试了什么?我发布的示例有效….$?不应该在那里使用<代码>如果
接受命令,并且赋值语句是命令。请看我的答案。@ORMAJ:[…]]构造称为扩展测试命令()。@sashang它称为“条件表达式复合命令”。为了执行数值比较,最好使用算术复合命令:
($?==0))
,但是,测试$?如果可以直接测试退出状态(就像这里一样),则根本不应该这样做。此外,ABS不是一个好的信息来源。它充满了错误和糟糕的建议。你想做的事(晚一点)是不可能的。只有当
#时,shebang才是shebang是文件中的前两个字符。我应该检查我首先运行的shell如果你使用shebang,并且你请求的shell可用,这就是将使用的shell,如果不可用,执行可能会停止<代码>/usr/bin/bash
非常标准。您没有责任担心那些以非标准方式配置系统的人。通常,
$SHELL
将被设置为默认SHELL的路径,如果您没有使用shebang,将运行脚本。除此之外,我不确定是否有办法确定是谁在执行。我尝试这样做是出于兴趣,即使它显示我正在做的事情不起作用,并且如果没有向它发送参数,它只返回-1。