我有一个bash
脚本,它将/bin/sh
在Solaris计算机上被调用。当我以运行脚本时/bin/sh ./solarisSh
,它可以工作。当我获取相同的脚本时,它将失败。
我知道bash
,伯恩·壳牌几乎一无所获。这不是我的问题。
我的问题是:为什么/bin/sh
在采购文件时与单纯执行文件时Solaris的行为有何不同?
这是数据...
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
在采购文件时不起作用?
谢谢。
埃里克
删除$(...)
命令替换将为我消除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命令替换,但实际脚本可能更复杂。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句