如何比较脚本中`which`与-1的返回值?

时间:2012-05-07 06:15:20

标签: bash

我正在尝试设置一个找到bash位置的脚本,然后在shabang中使用它,我没有使用env,因为我读过的示例脚本使用符号链接{{1如果它不在env中,那么为什么我可以使用usr/bin查找which然后设置链接呢? 我遇到的问题是如果找不到命令则比较bash的返回值(-1) 编辑:我看过手册错误which只返回-1,如果没有发送agrs

但-1是换行符,当我比较它是真的时,我得到的错误是我将字符串which与数字-1进行比较

我尝试了几种不同的方法,但无法弄清楚如何让它发挥作用

/bin/bash

4 个答案:

答案 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

发现只会在成功终止时设置(即,如果找到)