web-dev-qa-db-ja.com

「>>ファイルコマンド」とは何ですか?「コマンド>>ファイル」とどう違うのですか?

この非常に投票された コメント から ターミナルコマンドで `>>`はどういう意味ですか? からピックアップ:

「前のプログラム」それはどういう意味ですか?明らかにコマンドですが、リダイレクトを先頭に書き込むこともできます。つまり、>> file command

そのようなケースを見たのを覚えていませんが、賛成票の数を考えると、明らかに存在しています。この形式のリダイレクトコマンドを見たり使用したりしたことがあります

command >> file

>>とその同類(つまり、2>2>&1など)を使用する場合。

いつ、なぜ順序を逆にしますか? stdoutからだけでなく、すべてのcommandがリダイレクトされるということですか?具体的な例はありますか?

私は google を持っていて、すぐに例を見つけることができました。

6
Greenonline

>> file command
コマンドからだけでなく、すべてのstdoutがリダイレクトされるという意味ですか?

このようなリダイレクトは、単純なコマンドに影響します。から man 1 bash

コマンドが実行される前に、その入力と出力は、シェルによって解釈される特別な表記法を使用してリダイレクトされる場合があります。 […]次のリダイレクト演算子は、単純なコマンド内のどこかに先行または表示される場合と、コマンドの後に続く場合があります。リダイレクトは、左から右に表示される順序で処理されます。

「次のリダイレクト演算子」は、[n]<Word[n]>Word[n]>>Wordなどです。

単純なコマンドは、オプションの変数割り当てのシーケンスであり、その後に空白で区切られた単語とリダイレクトが続き、制御オペレーターによって終了されます。

そして

制御オペレーター
制御機能を実行するトークン。これは、次の記号の1つです。
||&&&;;;()||& <改行>

これは、次のコマンドが同等であることを意味します。

echo Some text >> file
echo Some >> file text
echo >> file Some text
>> file echo Some text

質問にはタグが付けられています bash そして私はman 1 bashを引用しますが、上記のコマンドはshでも機能します。

コマンドラインパーサーは、コマンドを実行する前にすべてのリダイレクトを「提供」する必要があります(つまり、コマンドからこれらのリダイレクトが削除されます)。考えてみてください。特定のリダイレクトがどこにあるかに関係なく、手順は同じです。それが最後にあることを要求する理由はありません。


いつ、なぜ順序を逆にしますか?

途中でリダイレクトしたかったのを覚えていません。ただし、最初に入力リダイレクトを設定すると非常に便利なユースケースがあります。このコードを検討してください:

grep foo file | tail | …

パイプが非常に長いと想像してください。スーパーユーザーに投稿され、いくつかの問題を解決します。それをコンソールに貼り付けて実行することができます。コマンドまたはパイプに追加したい場合はどうなりますか?例えば。あなたが取得したい:

my_custom_command | grep foo | tail | …
#                   ^^^^^^^^^^^^^^^^^^^ this is the part you'd be happy to paste

コピーしたコマンドからfileを削除する必要があります。このため、一部のユーザーは次のようなコマンドを投稿することを好みます。

cat file | grep foo | tail | …
#          ^^^^^^^^^^^^^^^^^^^ it's easy to copy this
#        ^^^^^^^^^^^^^^^^^^^^^ or even this

他の状況では、これはcatのまったく役に立たない使用になります。状況に関係なく、まだそうだと言う人もいます。どうですか:

< file grep foo | tail | …
#      ^^^^^^^^^^^^^^^^^^^ it's easy to copy this

catand便利なフォームはありません!

6

説明

I/Oリダイレクト演算子がどのように機能するかを理解するための鍵は、入力するすべてのコマンドで常にSTDOUTまたはSTDERR(主に)に出力するシェル内で作業していることを覚えておくことです。

>>は出力が発生するかどうかhowを気にしませんが、出力が発生した場合にのみ、その直後のファイルに追加できます。 。リダイレクト演算子はコマンドに関与しないことを覚えておくことも重要です。 echo hello >> newfile this is my outputと入力すると、さらにテストできます。cat newfileと入力すると、「こんにちは、これが私の出力です」と表示されます。

この特定のケースでは、追加演算子(>>)と組み合わせたコマンドの順序は、必ずしも注意すべき重要なことではありません。代わりに、上記のカミルのコメントでは説明されていないように、コマンドのresultを監視してください^。エラーではないものがシェルに出力される限り、>>はそのことを実行できます。

Echoコマンドの仕事は、標準出力(STDOUT)に出力することです。単独で試してみると、出力に新しい行が表示されます。ミックスに>> fileを含めると、その改行に表示されるものがすべてそのファイルに追加されます。ただし、この順序重要です。追加するファイルは、演算子の直後にある必要があります。

例に関する注記

具体的な例としては、順序を切り替えると、あるソースから別のソースを指す2つの矢印よりも直感的で読みにくいため、多くは見つかりません。さらに、冗長なシェルスクリプトを作成する場合、直感的で読みやすいコードの必要性がさらに高まります。


これをさらに深く理解したい場合は、 ファイル記述子 (STDIN、STDOUT、STDERR)およびUnix システムコール のしくみについて学び始めることができます。これはすべて、Unixシステムプログラミングへの窓として、そしてUnix/Linuxがより深いレベルでどのように機能するかを見ることができます。

3
baelx