4

我有一组用于更复杂的 shell 脚本的小帮助脚本,虽然这很好用,但出于各种原因,我决定将其简化为单个脚本。

所以我想我会在这里使用文档,这样我就可以创建“嵌套”的 shell 脚本,以便根据需要在本地或远程运行。这很好用,因为我可以执行以下操作:

#!/bin/sh
nested_script=$(cat << 'NESTED_SCRIPT'
    # Script commands
NESTED_SCRIPT
)
echo "$nested_script" | sh

不是最实用的示例,但我可以将它发送到的事实ssh使它非常有用。

但是,我遇到的问题是我无法弄清楚如何为嵌套脚本提供参数,就好像我在sh命令中添加了任何内容一样,它会将其解释为要运行的文件并完全忽略标准输入。

在我的本地机器上我可以做到echo "$script" | sh /dev/stdin "foo" "bar"并且它会完美地工作,但我不相信我正在使用的远程机器支持/dev/stdin以这种方式使用。

还有其他解决方案吗?目前我正在使用强制将参数放入脚本字符串中,sed但这不是一个很好的方法。

对于那些想知道的人;我尝试这样做的原因是我的嵌套脚本可能在本地运行,也可能在远程运行,具体取决于是否提供了主机。我真的不想在远程主机上创建要运行的文件,而是只想远程运行命令,这种方法似乎可以启用(如果我可以让它像我想要的那样工作)。

4

1 回答 1

7

使用sh -s

echo "$nested_script" | sh -s "foo" "bar"

您也可以将脚本作为参数传递-c

sh -c "$nested_script" -- "foo" "bar"

这释放了脚本的标准输入。

于 2013-07-07T19:19:44.820 回答