首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何将这个bash脚本转换为纯bourne?

我如何将这个bash脚本转换为纯bourne?
EN

Stack Overflow用户
提问于 2014-06-21 01:09:44
回答 3查看 955关注 0票数 0

我对这两种语言都不熟悉,所以我需要一些帮助来确定这个脚本的哪些部分包含“bashism”或bash专用语法,这些语法可能会在纯bourne-shell解释器上出错。

代码语言:javascript
复制
#!/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,但还有什么是我遗漏的吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-21 01:16:52

唯一立即突出的变化是:

代码语言:javascript
复制
if [[ $0 == '/'* ]]; then

更改为

代码语言:javascript
复制
firstchar=`sed -e "s/\/.*$/\//" <<< $0`
if test "$firstchar" = "/"; then

与托壳的差异进行二次检查

票数 -3
EN

Stack Overflow用户

发布于 2014-06-21 02:14:36

[[ ]]测试是我看到的唯一的基础测试,但是在posix与shell兼容的脚本中替换它并不容易。我看到的两个选项是使用case

代码语言:javascript
复制
case "$0" in
    "/"*)
        TMPDIR="`dirname $0`" ;;
    *)
        TMPDIR="`pwd`"/"`dirname $0`" ;;
esac

...or在shell扩展中使用了稍微奇怪的匹配技巧:

代码语言:javascript
复制
if [ "${0#/}" != "$0" ]; then

其工作方式是将"${0#/}"扩展为$0,但删除一个前导"/“(如果有)。然后将其与"$0"进行比较,如果它是不同的(!=),那么$0必须以"/“开头。

顺便说一句,正如Aleks-Daniel所指出的,有许多变量引用不是双引号,在某些情况下可能会造成麻烦(例如文件名中的空格)。修复这个问题并不简单,因为双引号必须在反引号之间转义。如果您关心这个问题,我建议首先用$( )替换所有的反引号(这是posix标准中的,所以应该是可移植的)。然后你可以很干净地嵌套双引号,就像在TMPDIR="$(pwd)/$(dirname "$0")"中一样(注意:我还把/放在双引号里了--这实际上并不重要,我只是觉得它更容易阅读)。

BTW2,是否有任何理由在接近尾端捕获nohuped命令的(不存在)输出?也就是说,为什么不替换

代码语言:javascript
复制
RESULT=`nohup sh stub2 1>$TMPDIR/nohup.out 2>$TMPDIR/nohup.out2 3>/dev/null &`

带着

代码语言:javascript
复制
nohup sh stub2 1>$TMPDIR/nohup.out 2>$TMPDIR/nohup.out2 3>/dev/null &
票数 1
EN

Stack Overflow用户

发布于 2014-06-21 01:18:54

现在还不清楚“纯粹的伯恩壳”这样的东西是否存在。您可以将shebang写为/bin/sh以强制"sh only“模式,但实际上它只是强制POSIX遵从。然而,这可能会使你在一般意义上得到你想要的东西。

有关更多信息,您可以查看以下两个来源:

http://www.network-theory.co.uk/docs/bashref/BashPOSIXMode.html

https://unix.stackexchange.com/questions/44836/when-sh-is-a-symlink-to-bash-or-dash-bash-limits-itself-to-posix-compliance-so

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24337348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档