4

私は、より複雑なシェル スクリプト用の小さなヘルパー スクリプトのコレクションを持っています。これはうまく機能しますが、さまざまな理由から、これを 1 つのスクリプトにまとめたいと考えました。

そこで、必要に応じてローカルまたはリモートで実行するための「ネストされた」シェル スクリプトを作成できるように、ヒア ドキュメントを使用することを考えています。私は次のことができるので、これは十分にうまくいきます:

#!/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"

これにより、スクリプトの stdin が解放されます。

于 2013-07-07T19:19:44.820 に答える