0

私は次のことをしようとしています:

uname>>1.txt | echo #####>>1.txt | echo uname>>1.txt &

次の出力を取得します。

uname
## ## ## ## ##

Linux (または名前が何であれ)

しかし、代わりに出力として得られるのは次のとおりです。

ただし、試してみると:

uname>>1.txt | echo uname>>1.txt &

次に、次の出力が得られます。

uname

Linux 

この種のパイプによるリダイレクトに何らかの制限があるかどうか疑問に思っていますか?

================================================== =====================

Tcl スクリプト内からこのシェル コマンドを呼び出します。実際には、tcl スクリプト内から実行されるコマンドのリストがあり、出力は次の方法でフォーマットする必要があります <------->

これらのコマンドの出力は互いに関連していないため、実行時間を短縮するためにバックグラウンドで実行したかったのです。

() 内のコマンドは、フォーマットされた出力をバックグラウンド プロセスとして 1.txt に出力すると思いました。

これを行う別の方法を提案しますか?

4

1 に答える 1

2

ここには多くの問題があります。

  1. 一般に、出力リダイレクトとパイプを組み合わせることはお勧めできません。リダイレクトされると、パイプする必要はありません。
  2. へのパイプechoは少し意味がありません。
  3. バックグラウンドで一連のコマンドを配置するには、括弧を使用します。
  4. これをバックグラウンドに置くべきではありません。
  5. 通常、コマンドは右から左ではなく、左から右に実行されます。

あなたが欲しいのは

(echo uname > 1.txt; echo ------ >>1.txt; uname >>1.txt)


更新(コメントおよび質問への変更ごと)

このコマンドを使用して、本質的に未定義の動作を呼び出し続けています。

uname>>1.txt | echo uname>>1.txt &

uname出力をリダイレクトすると、パイプするものが何もないため、パイプ元は無効です。echo標準入力から読み取らないため、パイプ toは無効です。unameまたはコマンドのどちらがecho最初に出力をファイルに出力するかは、1.txtここで把握できます。これは明らかにあなたが望むものです:

bash -c 'echo uname >> 1.txt; エコー ------ >> 1.txt; うなめ >> 1.txt'

-cへのオプションに注意してくださいbash。これは bash に、次の引数-cがシェル コマンドを含む文字列であることを伝えます。

于 2012-11-06T10:43:42.123 に答える