標準入力「スキップ」プロセス?

標準入力「スキップ」プロセス?

stdinがプロセスを「スキップ」する方法はありますか?たとえば、次のコマンドでは

cat file | ssh host 'mkdir -p /some/directory && cat > /some/directory/file'

catこれは、最初から2番目に標準入力を送信し、mkdir2番目はcat標準入力を受け取りません。最初の標準出力をcatスキップしてmkdir2番目の標準出力にのみ送信したいですcat。私はあなたが次のようなことを実行できることを知っています。

cat file | ssh host 'cat > /tmp/file2 ; mkdir -p /some/directory && mv /tmp/file2 /some/directory/'

ファイルをコピーするときのみ

cat file | ssh host 'tee >(mkdir -p /some/directory) >/some/directory/file'

ただし、これはmkdirコマンドが標準入力を使用しないために機能します。この機能を複製するコマンドはありますか?それは次のとおりです。

cat file | ssh host 'stdinhop mkdir -p /some/directory | cat > /some/directory/file'

stdinhopstdinをmkdirに送らずに2番目の猫が読めるようにstdoutにリダイレクトする場所はどこですか?

答え1

次に、最初のコマンドの標準入力をリダイレクトできます/dev/null

anthony@Watt:~$ echo -e 'hello\nworld' | ssh localhost 'cat < /dev/null && cat -n'
     1  hello
     2  world

行には番号が付けられているので、2行目から取得します cat

SSH を使用しない場合は、サブシェルを使用できます。echo -e 'hello\nworld' | ( cat < /dev/null && cat -n )

答え2

実際、あなたが望むことはすでに行われています。もちろん、mkdirあなたの問題ではありません。stdinとにかく読まれません。パイプは、sshそのようなものが得られない限り、標準入力として-のすべての子に継承されますssh -t

それに加えて、問題は、これらのコマンドを実行するシェルが子のssh1つであるということです。タスクの一部は、実行する各コマンドグループに対して0,1,2を開くことです。入力は、共通記述子(シェルが各子に対して再び開く記述子)にあるため、シャッフルで失われます。

したがって、最も簡単なのは、入力をこれら3つのデフォルト値の1つではなく記述子に移動することです。たとえば、次は私にとって効果的でした。

echo hey there >file
cat file | ssh mikeserv@localhost '
               exec 3<&0
               mkdir -p .
               echo ho there
               cat <&3'

上記を実行すると、次のように印刷されます。

ho there
hey there

-Wオプションの中にいくつかのユーティリティを見つけることもできますsshman ssh説明する:

  • -W 所有者 :ポート- クライアントの標準入力と出力を次に渡すように要求します。所有者存在するポート安全なパスを介して、、、-Nおよびを意味します。-TExitOnForwardFailureClearAllForwardingsプロトコルバージョン2でのみ利用可能

関連情報