我对这两种语言都不熟悉,所以我需要一些帮助来确定这个脚本的哪些部分包含“bashism”或bash专用语法,这些语法可能会在纯bourne-shell解释器上出错。
#!/bin/sh
RUNDIR=".run.%SSH_LONG_ID%"
TMPDIR="/tmp/$RUNDIR"
mkdir $TMPDIR
cd $TMPDIR
####################
# Create 'stub2' script
####################
sed 's/^ //' >stub2 << 'MARKITEIGHTDUDE'
#!/bin/sh
#
TMPDIR=`pwd`
touch running
sh command
echo $?
cd $TMPDIR
rm -f running
MARKITEIGHTDUDE
####################
# Create 'command' script
####################
sed 's/^ //' >command << 'MARKITEIGHTDUDE'
#!/bin/sh
#
TMPDIR=`pwd`
%SNCCOMMAND%
MARKITEIGHTDUDE
####################
# Create 'complete' script
####################
sed 's/^ //' >complete << 'MARKITEIGHTDUDE'
#!/bin/sh
#
if [[ $0 == '/'* ]]; then
TMPDIR="`dirname $0`"
else
TMPDIR="`pwd`"/"`dirname $0`"
fi
STATUS=`tail -n 1 $TMPDIR/nohup.out`
sed '$d' < $TMPDIR/nohup.out > $TMPDIR/nohup.out2
mv $TMPDIR/nohup.out2 $TMPDIR/nohup.out
cat $TMPDIR/nohup.out
rm -f $TMPDIR/nohup.out
rm -f $TMPDIR/stub2
rm -f $TMPDIR/complete
rm -f $TMPDIR/command
%ADDITIONALFILES_REMOVE%
rmdir $TMPDIR
exit $STATUS
MARKITEIGHTDUDE
####################
# Create additional scripts
####################
%ADDITIONALFILES_ADD%
##
RESULT=`nohup sh stub2 1>$TMPDIR/nohup.out 2>$TMPDIR/nohup.out2 3>/dev/null &`
sleep 1
echo "sncrun:$RUNDIR"
exit 0我认为语法只是bash,但还有什么是我遗漏的吗?
发布于 2014-06-21 01:16:52
唯一立即突出的变化是:
if [[ $0 == '/'* ]]; then更改为
firstchar=`sed -e "s/\/.*$/\//" <<< $0`
if test "$firstchar" = "/"; then在与托壳的差异进行二次检查
发布于 2014-06-21 02:14:36
[[ ]]测试是我看到的唯一的基础测试,但是在posix与shell兼容的脚本中替换它并不容易。我看到的两个选项是使用case
case "$0" in
"/"*)
TMPDIR="`dirname $0`" ;;
*)
TMPDIR="`pwd`"/"`dirname $0`" ;;
esac...or在shell扩展中使用了稍微奇怪的匹配技巧:
if [ "${0#/}" != "$0" ]; then其工作方式是将"${0#/}"扩展为$0,但删除一个前导"/“(如果有)。然后将其与"$0"进行比较,如果它是不同的(!=),那么$0必须以"/“开头。
顺便说一句,正如Aleks-Daniel所指出的,有许多变量引用不是双引号,在某些情况下可能会造成麻烦(例如文件名中的空格)。修复这个问题并不简单,因为双引号必须在反引号之间转义。如果您关心这个问题,我建议首先用$( )替换所有的反引号(这是posix标准中的,所以应该是可移植的)。然后你可以很干净地嵌套双引号,就像在TMPDIR="$(pwd)/$(dirname "$0")"中一样(注意:我还把/放在双引号里了--这实际上并不重要,我只是觉得它更容易阅读)。
BTW2,是否有任何理由在接近尾端捕获nohuped命令的(不存在)输出?也就是说,为什么不替换
RESULT=`nohup sh stub2 1>$TMPDIR/nohup.out 2>$TMPDIR/nohup.out2 3>/dev/null &`带着
nohup sh stub2 1>$TMPDIR/nohup.out 2>$TMPDIR/nohup.out2 3>/dev/null &发布于 2014-06-21 01:18:54
现在还不清楚“纯粹的伯恩壳”这样的东西是否存在。您可以将shebang写为/bin/sh以强制"sh only“模式,但实际上它只是强制POSIX遵从。然而,这可能会使你在一般意义上得到你想要的东西。
有关更多信息,您可以查看以下两个来源:
http://www.network-theory.co.uk/docs/bashref/BashPOSIXMode.html
https://stackoverflow.com/questions/24337348
复制相似问题