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