stdin(標準入力)
100%

テキスト操作 · レッスン 2

stdin(標準入力)

プログラムが標準入力を読み取る仕組みと、Bash がそのストリームをファイルへ接続する方法を学びます。

標準入力(stdin)は、プログラムが通常、受け取ったデータを読み込むストリームです。対話型端末では、シェルは一般に stdin を端末入力へ接続するため、プログラムは入力した内容を読み取れます。

標準入力とファイルディスクリプタ 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 つの接続を行います。

  1. < peanuts.txtpeanuts.txtcat の stdin として開きます。
  2. > banana.txtbanana.txt を作成または切り詰めて、cat の stdout へ接続します。

cat は stdin からバイトを読み取り、stdout へ書き出すため、banana.txt には元の内容が入ります。通常のファイルコピーなら cp peanuts.txt banana.txt のほうが意図を直接伝えられますが、ここでの例はストリームの接続を示すものです。

cat < input.txt > output.txt では、どのファイルが stdin を供給し、どのファイルが stdout を受け取りますか?

入力と出力のリダイレクトを練習するには、次のハンズオンラボを試してください。

  1. Linux における入出力のリダイレクト - >>>2> などの演算子や tee コマンドを使って標準出力、標準エラー、標準入力を操作し、コマンドからのデータフローを制御する練習をします。
  2. データストリームのリダイレクト - Linux のストリームリダイレクトを学びます。標準入力、出力、エラーストリームを操作し、出力を結合し、高度なファイル操作に /dev/null を利用します。

レッスン完了

stdin(標準入力) を完了しました

シェルを通じて、コマンドの標準入力をファイルへ接続できるようになりました。

  • stdin がファイルディスクリプタ 0 であることを認識する。

  • < で読み取り可能なファイルをリダイレクトする。

  • ファイル名オペランドとリダイレクトされた入力を区別する。

  • stdin と stdout のリダイレクトを意図的に組み合わせる。

学習進捗を保存

無料アカウントを作成してこのレッスンを保存し、どのデバイスからでも学習を続けられます。

無料アカウントを作成
次のレッスン
テキスト操作 に戻る