【问题标题】:Run script commands from stdin, with arguments从标准输入运行脚本命令,带参数
【发布时间】:2013-07-05 01:21:37
【问题描述】:

我有一组用于更复杂的 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 将参数强制到脚本字符串中,但这不是一个很好的方法。

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

【问题讨论】:

    标签: shell ssh


    【解决方案1】:

    使用sh -s:

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

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

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

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

    【讨论】:

    • 啊哈,谢谢!我知道我必须错过一些东西!您对-c 的看法也是正确的,看起来我现在有很多用于我所有用例的选项,再次感谢!
    • cat myscript.bash | bash -s -- --my-option 也可以正常工作!
    猜你喜欢
    • 2014-03-28
    • 1970-01-01
    • 2021-11-13
    • 2016-12-18
    • 2010-09-13
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 2018-12-22
    相关资源
    最近更新 更多