入力と出力のリダイレクトは、プログラミング言語やスクリプト言語の自然な機能です。技術的には、コンピュータを操作するたびに本質的に発生します。入力はstdin
から読み取られます (標準入力、通常はキーボードまたはマウス)、出力は stdout
に送られます (標準出力、テキストまたはデータストリーム)、およびエラーは stderr
に送信されます 。これらのデータストリームが存在することを理解することで、BashやZshなどのシェルを使用しているときに情報がどこに行くかを制御できます。
Linuxには、標準入力、標準出力、および標準エラーがファイルシステムの場所として存在します。それらは/dev
で見ることができます :
$ ls /dev/std*
/dev/stderr@ /dev/stdin@ /dev/stdout@
それらを直接使用することはできませんが、データを送信できるメタロケーションと考えると便利な場合があります。
リダイレクトの基本は単純です。いくつかの>
を使用します 出力をリダイレクトする文字、およびいくつかの <
入力をリダイレクトする文字。
lsコマンドの出力をファイルに書き込むには:
$ ls > list.txt
ls
の出力は表示されません 通常どおり、出力は list.txt
に書き込まれるためです。 画面の代わりにファイル。実際、これは非常に用途が広いので、あるファイルの内容を別のファイルにコピーするために使用することもできます。テキストファイルである必要もありません。バイナリデータにリダイレクトを使用できます:
$ cat image.png > picture.png
(なぜそれをやりたいのか疑問に思っている場合は、ファイルのアクセス許可に影響を与えることがあります。)
入力をコマンドに「リダイレクト」することもできます。多くのコマンドは、指定した引数から入力を取得するようにすでにハードコーディングされているため、これは出力のリダイレクトよりもおそらく有用ではありません。ただし、コマンドが引数のリストを予期していて、それらの引数がファイルにあり、ファイルからターミナルにすばやく「コピーアンドペースト」したい場合(実際にはコピーしたくない場合を除く)に便利です。貼り付け):
$ sudo dnf install $(<package.list)
入力リダイレクトの一般的な使用法は、ヒアドキュメントです。 (または単にヒアドキュメント 略して)およびここの文字列 テクニック。この入力メソッドは、テキストのブロックを標準の入力ストリームに、特別なファイルの終わりマーカーまでリダイレクトします(ほとんどの人は EOF
を使用します) 、ただし、一意であると予想される任意の文字列にすることができます)。これを入力してみてください( EOF
の2番目のインスタンスまで) )ターミナルに:
$ echo << EOF
> foo
> bar
> baz
> EOF
期待される結果:
foo
bar
baz
ヒアドキュメント これは、Bashスクリプターが数行のテキストをファイルまたは画面にダンプするために使用する一般的なトリックです。句をファイルの終わりマーカーで終了することを忘れない限り、 echo
の扱いにくいリストを回避する効果的な方法です。 またはprintf
ステートメント。
ここの文字列 ヒアドキュメントに似ています 、ただし、1つの文字列(または引用符で囲まれた単一の文字列に偽装した複数の文字列)で構成されます:
$ cat <<< "foo bar baz"
foo bar baz
エラーメッセージはstderr
というストリームに送られます 、 2>
として指定 リダイレクトの目的で。このコマンドは、エラーメッセージを output.log
というファイルに送信します。 :
$ ls /nope 2> output.log
/ dev/nullへのデータの送信
Bashの詳細
- バッシュチートシート
- Bashを使用したプログラミングの概要
- Bashスクリプトに関するシステム管理者ガイド
- 最新のBash記事
標準入力、標準出力、エラーの場所があるのと同じように、どこにもない場所もあります。 Linuxファイルシステム上。これはnull
と呼ばれます 、および / dev
にあります 、そのため、「slashdevslashnull」と言うにはあまりにも頻繁に使用する人々によって「devnull」と発音されることがよくあります。
/ dev / null
にデータを送信できます リダイレクトを使用します。たとえば、 find
コマンドは冗長になる傾向があり、ファイルの検索中に権限の競合が報告されることがよくあります:
$ find ~ -type f
/home/seth/actual.file
find: `/home/seth/foggy': Permission denied
find: `/home/seth/groggy': Permission denied
find: `/home/seth/soggy': Permission denied
/home/seth/zzz.file
find
コマンドはそれをエラーとして処理するため、エラーメッセージだけを / dev / null
にリダイレクトできます。 :
$ find ~ -type f 2> /dev/null
/home/seth/actual.file
/home/seth/zzz.file
リダイレクトは、Bashのある場所から別の場所にデータを取得するための効率的な方法です。常にリダイレクトを使用するわけではありませんが、必要なときにリダイレクトを使用することを学ぶと、ファイルを開いたり、データをコピーして貼り付けたりする必要がなくなります。これらはすべて、通常、マウスを動かしたり、キーを押したりする必要があります。そのような極端に頼らないでください。良い生活を送り、リダイレクトを使用します。