Linux Unix shell脚本:将shell选项(-x等)传递给嵌套脚本

Linux Unix shell脚本:将shell选项(-x等)传递给嵌套脚本,linux,bash,shell,unix,posix,Linux,Bash,Shell,Unix,Posix,如何使用相同的选项运行嵌套的shell脚本?比如说, parent.sh #!/bin/sh ./child.sh #!/bin/sh ls child.sh #!/bin/sh ./child.sh #!/bin/sh ls 如何修改parent.sh,以便在使用sh-x parent.sh运行它时,-x选项在child.sh中也有效,并且ls的执行显示在我的控制台上 我正在寻找一种可移植的解决方案,这种解决方案对于罕见的情况非常有效,例如系统用户将/bin/false作为其注册she

如何使用相同的选项运行嵌套的shell脚本?比如说,

parent.sh

#!/bin/sh
./child.sh
#!/bin/sh
ls
child.sh

#!/bin/sh
./child.sh
#!/bin/sh
ls
如何修改
parent.sh
,以便在使用
sh-x parent.sh
运行它时,
-x
选项在
child.sh
中也有效,并且
ls
的执行显示在我的控制台上

我正在寻找一种可移植的解决方案,这种解决方案对于罕见的情况非常有效,例如系统用户将
/bin/false
作为其注册shell。
$SHELL
环境变量是否有帮助


澄清:有时我想用
-x
调用
parent.sh
,有时用
-e
,具体取决于具体情况。因此,解决方案不得涉及对标志进行硬编码。

如果使用
bash
,我可以推荐以下方法:

#!/bin/bash
export SHELLOPTS
./child.sh
您可以根据需要进行多次传播,也可以在接下来的每个脚本中使用
echo$SHELLOPTS
,查看发生了什么,以及如果您需要更好地理解它,如何传播选项


但是对于
/bin/sh
来说,它将使用
/bin/sh:SHELLOPTS:readonly变量失败
,因为POSIX是如何在各种系统中对
/bin/sh
强制执行的,更多信息如下:

这看起来像是一种黑客行为,似乎不是最好的方法。
但它会完全满足你的要求

其中一种方法是创建别名,为
sh
创建包装:

alias saveShell='cp /bin/sh $some_safe_place'

alias shx='cp $some_safe_place /bin/x_sh; rm /bin/sh; echo "/bin/x_sh -x $@" > /bin/sh; chmod 755 /bin/sh '

alias she='cp $some_safe_place /bin/e_sh; rm /bin/sh; echo "/bin/e_sh -e $@" > /bin/sh; chmod 755 /bin/sh '
alias restoreShell='cp  $some_safe_place /bin/sh'
如何使用:
运行
saveShell
,然后使用
shx
she
,如果您想在
-e
上更改
-x
,请运行
restoreShell
,然后运行
shx
she
像往常一样运行脚本 sh./parent.sh

移动SH时要非常小心

其他解决方案
替换
#/bin/sh
#/bin/sh-x
#/在运行脚本之前,在所有sh文件中使用bin/sh-e
sed

我非常喜欢你的帖子:-)