如何使用相同的选项运行嵌套的shell脚本?例如,
parent.sh
#!/bin/sh
./child.sh
child.sh
#!/bin/sh
ls
如何修改parent.sh
,以便在我使用sh -x parent.sh
运行时,-x
选项在child.sh
中也有效并执行ls
我的控制台上显示了什么?
我正在寻找一种便携式解决方案,该解决方案适用于罕见情况,例如/bin/false
作为注册shell的系统用户。 $SHELL
环境变量会有任何帮助吗?
澄清:我有时希望parent.sh
使用-x
,有时使用-e
,具体视情况而定。因此,解决方案不得涉及对标志进行硬编码。
答案 0 :(得分:1)
如果您使用bash
,我可以推荐以下内容:
#!/bin/bash
export SHELLOPTS
./child.sh
您可以根据需要进行多次传播,也可以在线下的每个脚本中使用echo $SHELLOPTS
来查看正在发生的事情以及如果您需要更好地理解选项,那么选项的传播方式。
但是对于/bin/sh
,由于/bin/sh: SHELLOPTS: readonly variable
在各种系统中对POSIX的强制执行方式,/bin/sh
会失败,https://lists.gnu.org/archive/html/bug-bash/2011-10/msg00052.html
答案 1 :(得分:1)
您可以采用的方法之一 - 创建别名以创建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
,如果您要-x
运行-e
更改restoreShell
,然后运行shx
或she
像往常一样运行脚本
sh ./parent.sh
非常小心移动SH
其他解决方案
在运行脚本之前,在所有sh文件中将#!/bin/sh
替换为#!/bin/sh -x
或#!/bin/sh -e
{/ 1}}。