我有一个将在 Solaris 计算机上bash
调用的脚本。/bin/sh
当我运行脚本时/bin/sh ./solarisSh
,它起作用了。当我获取相同的脚本时,它失败了。
我知道bash
和 Bourne Shell 几乎没有什么相似之处。这不是我的问题。
我的问题是:为什么 Solaris/bin/sh
在获取文件时与单纯执行文件时的行为如此不同?
这是数据...
ns2 ~/tmp 560> env -i /bin/sh -x
$ uname -a
+ uname -a
SunOS ns2 5.7 Generic_106541-15 sun4m sparc SUNW,SPARCstation-10
$ cat ./solarisSh
+ cat ./solarisSh
[ ! "$BASH" ] && {
>&2 echo "ERROR: $0 is a Bash script. Exiting."
return 1 2> /dev/null || exit 1
}
haveRootPriv() {
local idCmd=/usr/bin/id
local euid
local uid
[[ $OHM_OS == "SunOS" ]] && idCmd=/usr/xpg4/bin/id
if (( ( $( $idCmd -ru) == 0 ) || ( $( $idCmd -u) == 0 ) )); then
echo 1
return 0
fi
echo 0
return 1
}
$ /bin/sh -x ./solarisSh
+ /bin/sh -x ./solarisSh
+ [ ! ]
+ echo ERROR: ./solarisSh is a Bash script. Exiting.
ERROR: ./solarisSh is a Bash script. Exiting.
+ return 1
$ . ./solarisSh
+ . ./solarisSh
syntax error: `$' unexpected
$
这错误:./solarisSh 是 Bash 脚本。退出。这是我在获取文件时所期待的。我得到的是语法错误:“$”意外。
回顾一下这个问题:为什么 Solaris /bin/sh 在获取文件时与单纯执行文件时的行为如此不同?
我想我还有第二个问题(抱歉):为什么-x
在获取文件时不起作用?
谢谢。
-埃里克
答案1
删除$(...)
命令替换可以消除我在 5.10 上的失败。这表明您所看到的是.
在执行之前解析整个文件的效果,并在不受支持的语法中遇到错误。相比之下,脚本是逐行解析的,因此它会在注意到语法错误之前退出。
通过实验,您可以插入其他语法错误并看到相同的行为:.
提前失败,并sh
执行到格式错误的行。
为什么?我不知道。在我能找到的任何地方似乎都没有具体记录。手册页只是说.
:
. filename Read and execute commands from filename and return. The search path specified by PATH is used to find the direc- tory containing filename.
的文档<<word
说“shell 输入被读取到...”,这可能意味着简约的解析,但我在任何地方都没有看到任何明确的内容。一般来说,逐行解析对于 shell 脚本来说非常常见,例如,Bash 在这两种情况下都是这样做的。
为什么在获取文件时 -x 不起作用?
只要命令确实开始执行,它就确实有效。在解析阶段不会打印任何内容。
对于这个特定的示例,使用` ... `
-style 命令替换是可行的,但真正的脚本可能更复杂。