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

时间:2016-02-05 08:42:09

标签: linux bash shell unix posix

如何使用相同的选项运行嵌套的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,具体视情况而定。因此,解决方案不得涉及对标志进行硬编码。

2 个答案:

答案 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然后使用shxshe,如果您要-x运行-e更改restoreShell,然后运行shxshe 像往常一样运行脚本 sh ./parent.sh

非常小心移动SH

其他解决方案 在运行脚本之前,在所有sh文件中将#!/bin/sh替换为#!/bin/sh -x#!/bin/sh -e {/ 1}}。