プログラムは入出力ストリームを通じて情報をやり取りします。stdout と略される標準出力は、通常の結果を出すためにプログラムが使うストリームです。端末では、シェルが初めにこのストリームを端末表示へ接続します。
テキスト操作 · レッスン 1
標準出力 (stdout)
標準出力が端末へ流れる仕組みと、Bash でファイルへリダイレクトする方法を学びます。
標準出力へ書き込む
echo コマンドは引数を stdout へ書き込みます。
$ echo Hello World
Hello World
stdout はファイル記述子 1 で、複数のストリームをリダイレクトするときに役立つ番号です。プログラムには標準入力の stdin と標準エラーの stderr もあります。次のレッスンで扱います。
リダイレクトなしの場合、対話型端末で echo Hello World は通常の出力をどこへ送りますか?
`>` でファイルを置き換える
Bash は > を出力リダイレクト演算子として解釈します。コピー先ファイルを開き、コマンドの stdout を接続します。
$ echo Hello World > peanuts.txt
stdout は peanuts.txt へ向かうため、テキストは端末に現れません。ファイルがなければシェルが作成し、存在すればコマンドの書き込み前に切り詰めるため、以前の内容は失われます。
cat で結果を確認します。
$ cat peanuts.txt
Hello World
notes.txt にすでにテキストがあります。echo new > notes.txt は何をしますか?
シェルはコマンドの実行前にコピー先を開くため、Enter を押す前にパス名を確認してください。綴りを誤ったり、意図しない既存ファイルを指定したりすると、コマンド自体が後で失敗しても切り詰められます。
`>>` でファイルへ追記する
既存内容の後へ新しい stdout を追加する場合は >> を使います。
$ echo Another line >> peanuts.txt
$ cat peanuts.txt
Hello World
Another line
> と同じく、>> も存在しないコピー先を作成します。既存ファイルの開き方が異なり、>> は切り詰めず追記します。
status.log の既存内容を消さず、末尾へ Finished を追加するコマンドはどれですか?
リダイレクトを解釈するのはシェル
シェルが > と >> を認識し、プログラムへ渡す引数から取り除き、ファイルを開いてストリームの接続を準備します。コマンド自体は通常どおり stdout へ書き込むだけです。
したがって、同じリダイレクト構文を多数のコマンドで使えます。
$ pwd > current-directory.txt
$ ls -la >> directory-list.txt
pwd > current-directory.txt の > を通常解釈するのは誰ですか?
標準ストリームのリダイレクトを練習するには、次のハンズオンラボを利用してください。
- **Linux で入出力をリダイレクトする**:
>、>>、2>、teeなどで stdout、stderr、stdin を操作し、コマンドのデータフローを制御します。
レッスン完了
標準出力 (stdout) を完了しました
これで置換と追記を混同せず、コマンドの標準出力をリダイレクトできるようになりました。
stdout を通常のコマンド結果用ストリームとして認識する。
>でファイル内容を置き換える。>>で既存内容を保持して追記する。シェルがコピー先を開く前に、そのパスを確認する。