0

我正在尝试设置一个脚本来找到 bash 的位置,然后在 shabang 中使用它,我没有使用env,因为我读到的示例脚本说使用符号链接env以防万一它不在usr/bin所以为什么当我这样做时可以只使用which查找bash然后设置链接吗?我遇到的问题是比较返回是否找不到which命令(-1) which

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

我尝试了几种不同的方法,但不知道如何让它工作

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

4 回答 4

3

我正在尝试设置一个脚本来找到 bash 的位置,然后在 shabang 中使用它

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

如果你在页面的中间放置一个 shebang,它没有任何意义——它只是一个评论。要使 shebang 成为 shebang,#!必须是文件中的前两个字符。这是告诉外壳传递给任何东西;如果它没有找到,它就假定它是一个 shell 脚本。如果你想在这之后调用其他的 shell 或解释器,你必须像在命令行上那样做。

于 2012-05-07T06:25:33.343 回答
2

不仅绝对没有理由做你正在做的事情,而且试图检测 shell 的位置假定脚本已经在 shell 中运行。

无论你读到什么env都是错误的。没有理由期望它是一个符号链接。人们env在 shebang 中使用是因为找到 under 的机会比找到envunder的机会要大一些,但很多人甚至不理会这个。据推测,您之所以像这样跳过篮球是为了便携性,在这种情况下,这是一个非常糟糕且不标准的选择。而是使用, 或在 ksh 中, . 例如:/usr/binBash/binwhichtypewhence

if x=$(type -p bash); then
    "$x" myscript
else
    echo "Not found" >&2
fi

不幸的是,究竟type做什么也没有很好的标准化。只需执行命令,shell 要么做它的事情,要么抛出一个错误。仅在不常见的情况下才需要检查命令是否存在。

于 2012-05-07T06:50:49.103 回答
1

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

name=$(which bash)
if [[ $? == 0 ]]; 
    then echo "found"; 
fi

笔记

在您的问题中,您似乎假设错误始终为-1。一般来说,这是不正确的。程序将向 shell 返回一个非零错误代码。因此 0 是成功,任何其他值(包括 -1)都是失败。

于 2012-05-07T06:20:20.423 回答
1

你可以跑

which bash && found=true

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

于 2012-05-07T06:26:09.587 回答