標準入力(stdin)は、プログラムが通常、受け取ったデータを読み込むストリームです。対話型端末では、シェルは一般に stdin を端末入力へ接続するため、プログラムは入力した内容を読み取れます。
テキスト操作 · レッスン 2
stdin(標準入力)
プログラムが標準入力を読み取る仕組みと、Bash がそのストリームをファイルへ接続する方法を学びます。
標準入力とファイルディスクリプタ 0
慣例として、3 つの標準ストリームには次のファイルディスクリプタ番号が使われます。
0:標準入力(stdin)1:標準出力(stdout)2:標準エラー(stderr)
プログラムは、これらのストリームを使うかどうか、またどのように使うかを選べます。stdin を読み取るよう設計されたコマンドは、ファイルオペランドなどの入力元を指定しなければ、端末からの入力を待つことがよくあります。
慣例上、標準入力を表すファイルディスクリプタはどれですか?
ファイルを stdin へリダイレクトする
< 演算子は、ファイルを読み取り用に開き、コマンドの stdin へ接続するよう Bash に指示します。
$ cat < peanuts.txt
Hello World
< peanuts.txt を処理するのはシェルです。cat は単にファイルディスクリプタ 0 から読み取ります。パス名は通常のファイルオペランドとして cat に渡されません。
入力ファイルが存在しない、または開けない場合、シェルはリダイレクトエラーを報告し、その入力でコマンドを起動しません。
sort の標準入力を names.txt から読み取らせるコマンドはどれですか?
ファイルオペランドと入力リダイレクトの違い
コマンドによっては、ファイル名オペランドと stdin のどちらも受け取れますが、結果がわずかに異なることがあります。たとえば次のとおりです。
$ wc -l peanuts.txt
1 peanuts.txt
$ wc -l < peanuts.txt
1
どちらも同じデータの行数を数えています。1 つ目では、wc はファイル名を引数として受け取るため、その名前を認識しています。2 つ目では stdin のストリームだけを受け取るため、表示するファイル名がありません。
wc -l < peanuts.txt の出力に通常 peanuts.txt が含まれないのはなぜですか?
入力と出力のリダイレクトを組み合わせる
1 つのコマンドラインで複数のストリームをリダイレクトできます。
$ cat < peanuts.txt > banana.txt
シェルは独立した 2 つの接続を行います。
< peanuts.txtはpeanuts.txtをcatの stdin として開きます。> banana.txtはbanana.txtを作成または切り詰めて、catの stdout へ接続します。
cat は stdin からバイトを読み取り、stdout へ書き出すため、banana.txt には元の内容が入ります。通常のファイルコピーなら cp peanuts.txt banana.txt のほうが意図を直接伝えられますが、ここでの例はストリームの接続を示すものです。
cat < input.txt > output.txt では、どのファイルが stdin を供給し、どのファイルが stdout を受け取りますか?
入力と出力のリダイレクトを練習するには、次のハンズオンラボを試してください。
- Linux における入出力のリダイレクト -
>、>>、2>などの演算子やteeコマンドを使って標準出力、標準エラー、標準入力を操作し、コマンドからのデータフローを制御する練習をします。 - データストリームのリダイレクト - Linux のストリームリダイレクトを学びます。標準入力、出力、エラーストリームを操作し、出力を結合し、高度なファイル操作に
/dev/nullを利用します。
レッスン完了
stdin(標準入力) を完了しました
シェルを通じて、コマンドの標準入力をファイルへ接続できるようになりました。
stdin がファイルディスクリプタ 0 であることを認識する。
<で読み取り可能なファイルをリダイレクトする。ファイル名オペランドとリダイレクトされた入力を区別する。
stdin と stdout のリダイレクトを意図的に組み合わせる。