私はちょうど今以下に与えられたコマンドに出くわしました -
$ echo 'eval "$(jenv init -)"' >> ~/.bash_profile
私が推測できることから、それはおそらく.bash_profileの変更をコミットするために使用されますが、それは正確に何のために使用されますか?
プログラムの標準出力を>>
の前にリダイレクトし、それを与えられたファイルに追加します。
>>
は何をするのですか?>>
では、コマンドの出力をファイルに追加します。
あなたのコマンド例は基本的にいくつかの部分から成ります:
コマンド >> ファイル名
そのためcommand
の出力はfilename
に追加されます。
echo
という特定の場合はどうなりますか?あなたの特定のケースでは、echo "…"
コマンドはその入力引数を「標準出力記述子」である「stdout」に出力します。 echo
への入力引数の後には改行(\n
)が続くので、改行します。
ここで、「標準出力記述子」とは、コマンドを実行したときにシェルに表示される出力ストリームに他なりません。 (つまり、echo foo
と入力してEnterキーを押すと、foo\n
はecho
コマンドの実際の出力になります。これは、シェルによってfoo
の後に改行が続いて表示されます。)
基本的にあなたのコマンドラインに書いているものはすべてstdoutを使っています。エラーメッセージに一般的に使用される「stderr」と呼ばれる別の記述子もあります。また、標準出力のように印刷されるため、時々それらが散在する可能性があります。そして、入力に使われる標準入力記述子があります。詳しくは この記事 をご覧ください。
いつでも標準出力をファイル記述子にリダイレクトできます。これは、次のいずれかの演算子で行うことができます。
>
はファイル記述子にリダイレクトします。ファイルが存在しない場合は作成します。すでに存在する場合は、書き込み前にファイルを切り捨てます。そのため、ファイルは標準出力で上書きされます。
>>
はファイル記述子に追加します。ファイルが存在しない場合は作成します。
同様の方法で2>
または2>>
を使用してstderrをリダイレクトすることもできます。あるいは、stderrとstdoutを1つのファイルにまとめることもできます。2>&1
はそれを行います。リダイレクトの詳細といくつかの例については、 この小さなチュートリアル を参照してください。
一般的には、 explainshell.com を試してみてください。これにより、特定のシェルコマンドに関する視覚的なガイダンスと情報が得られます。
ちょうど例を見たい TLDR の人々のために;
>>の前のコマンドの標準出力(エラーではない)が、それにちなんで名付けられたファイルの末尾に追加されます。
したがって、ファイル "flintstones.txt"に次のものが含まれているとします。
Fred
Barney
echo Dino >> flintstones.txt
は、ファイルの最後に 'Dino'が追加されることになります。
Fred
Barney
Dino