これが私が段階的に達成したいものです。
- エルエス
- その後、出力を反転します。
- 次に、ファイルの末尾に新しい行を追加します。
だから私は次のような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 >>
ls
、tac
およびの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