エコ>>動作しません

エコ>>動作しません

これが私が段階的に達成したいものです。

  1. エルエス
  2. その後、出力を反転します。
  3. 次に、ファイルの末尾に新しい行を追加します。

だから私は次のような1行のスクリプトを作成しましたが、エラーが発生します。

(ls | tac | echo >>) > ./foobar

複数のコマンドに分割してこれを実行できますが、1つのコマンドでこれを実行したいと思います。

echo >> ./foobarファイルの末尾に新しい行が挿入されて混乱しています。

それでは、私のコードのこの行がうまくいかないのはなぜですか?echo >>ファイル記述子の末尾に新しい行を追加しませんが、エラーが発生するのはなぜですか?私がここで何を間違っているのか?

答え1

>>シンボルの直後のファイル名にコマンド出力を追加するようにシェルに指示します(したがって、少なくとも閉じるかっこの前に名前を追加する必要があります)。

必要な操作には、次のことができます。

ls | tac > ./foobar; echo >>./foobar

または:

(ls | tac; echo ) >./foobar

どちらも同じ結果を得ました。

答え2

指定された結果を得るには、次のようにします。

echo -e "`ls | tac`\n" > ./foobar

この方法での出力はlsパイプで接続されますtac。結果はコマンドに含まれ、echoエスケープ文字を解釈するためにecho新しい行が追加されます。その後、標準出力をファイルにリダイレクトできます。

私はstdoutをechoにパイプできるとは思いません。

答え3

コマンドを解析する方法は次のとおりです。

  • (…)複合命令です。括弧内の内容はサブシェルで実行されます。
    • ls | tac | echo >>lstacおよびの3つの部分からなるパイプラインですecho >>。最も左のセクションの出力は第2のセクションの入力に接続され、第2のセクションの出力は最も右のセクションの入力に接続される。
    • ls実行可能ファイルを実行する簡単なコマンドです。
    • tac実行可能ファイルを実行する簡単なコマンドです。
    • echo >>文法的に正しくありません。演算子>>の後にはファイル名が続くはずがありません。
  • > ./foobar複合コマンドの出力をファイルにリダイレクトします./foobar

次の入力を指示することは意味がありませんecho。入力を読みません。echo他のコマンドの出力に追加するために使用するには、次のようにします。echo 後ろに並列ではなく別のコマンドです。

ls | tac; echo

の出力はechoの出力と同じ位置に移動するため、tacリダイレクトは必要ありません。

( ls | tac; echo ) >./foobar

これにはサブシェルは必要ありません。簡単なグループ化が可能です。 (望むよりBashの単純な論理演算子Bash 角括弧演算子の要約。 )

{ ls | tac; echo; } >./foobar

>>演算子を使用して追加すでに存在するファイルに追加する場合にのみ必要です。ここではそうではありません。すべてのコマンドは同じ場所に移動し、ファイルはfoobar一度だけ開き、完全な複合コマンドの実行中は開いたままになります。>>ファイルを2回開く場合は、この演算子が必要です。

ls | tac >./foobar; echo >>./foobar

関連情報