Logs

来世はねこです

標準入出力・リダイレクション・パイプを理解する

何のために書いたか

コマンド間の情報をやり取りする仕組みを学ぶため

Linuxは、さまざまな処理に対応するためにコマンドを連携させていきます。

Linuxのコマンド1つ1つは、できるだけ小さくシンプルな動作に設計されていて、1つのコマンドに1つの機能です。それぞれのコマンドを単純にした方が分かりやすく、連携する時に使いやすいからです。

コマンドを連携させるための仕組みが、「リダイレクション・パイプ」です。
連携させてさまざまな処理を行えるようになるための前提となる「標準入出力」についてと合わせて、まとめてみました。

標準入力、標準出力、標準エラー出力

やりとりする仕組みを学ぶための予備知識。

「コマンドが実行されると、標準入出力チャンネルが開く」

抽象表現 具体例 数値
標準入力 プログラムの標準的な入力 キーボード(ファイルetc) 0
標準出力 プログラムの標準的な出力 ディスプレイ(ファイル・プリンタetc) 1
標準エラー出力 プログラムのエラーメッセージを出力するための標準的な出力
(エラーメッセージは、標準エラー出力に出力されている)
ディスプレイ (etc) 2

どこにつなぐかは、ユーザーが自由に設定できる。

コマンドの入出力先を抽象化しているおかげで、コマンド内部の動作を変更せずに、標準入出力先を柔軟に変更することができる。

リダイレクト

リダイレクトとは、「標準入出力先を変更する機能のこと」

リダイレクトの記法

記号 内容
< File 標準入力はFileからになる
> File 標準出力はFileに出る
>> File 標準出力はFileの末尾に追記となる
2> File 標準エラー出力はFileに出る
2>> File 標準エラー出力はFileの末尾に追記となる
> File 2>&1 標準出力と標準エラー出力をが、まとめて一つのFileに出る

コマンドの結果とエラーメッセージは分けておくと何かと便利なので、標準出力とは別に標準エラー出力は用意されている。

 リダイレクト先としたファイル名と同名のファイル名があった場合上書きされるので、元のファイルは内容は失われる。これを防ぐために常にこちらを使うのもよい。

別の方法として、シェルのオプション

set -o noclobber

と設定しておくと、リダイレクトで上書きしてしまう際にはエラーとなる。

パイプライン

コマンドの標準出力を別のコマンドの標準出力へつなぐ機能のこと

パイプ | (私のPCではshift¥)でつなぐ

Tips

  • Linuxで何かしらのコマンドを作る際、「ファイルを指定する」より、「標準入力から受け取る」仕組みで、プログラムを書くようにする。
  • リダイレクト先のファイルは自動的に作成される。
  • /dev/null
    特殊なリダイレクト先

    • 入力先として指定しても、何も内容を返さない。
    • 出力先として指定しても、書き込んだデータはどこにも保存されずに消えてしまう。
  • フィルタ
    標準入力を入力として受け取り、標準出力を出力として出力するコマンドのこと

    • cat
    • head
    • tail
    • grep
    • sort
    • uniq
    • tac
    • wc   、、、などなど

(参考書籍)
大好き。いつもお世話になっています。🙏 www.sbcr.jp

(OGTが表紙じゃないのが残念😮)