このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

【Linux】標準入出力

 LinuxやUNIX系システムでは、「標準入出力」はプロセス間やユーザーとのインターフェースとして非常に重要な役割を果たします。標準入出力には主に標準入力(stdin)、標準出力(stdout)、標準エラー出力(stderr)の3つがあります。それぞれを識別するためにファイルディスクリプター(識別子)として0、1、2の数字が割り当てられています。

標準入力(stdin)

定義: 標準入力は、ユーザーや他のプログラムからデータを受け取るための入力ストリームです。通常はキーボード入力が割り当てられています。

ファイルディスクリプター:

使用例:

 「cat」コマンドを引数なしで実行すると、キーボードからの入力待ち状態になります。例えば、「cat」を実行してから文字を入力し「Enter」キーを押すと、その入力がそのまま標準出力に表示されます。これは、「cat」コマンドが標準入力から受け取ったデータをそのまま標準出力に渡しているためです。

user01@ubuntu-vm:~$ cat
Hello Linux!
Hello Linux!
^C
user01@ubuntu-vm:~$ 

標準出力(stdout)

定義: 標準出力は、プログラムが生成する通常の出力データを表示するための出力ストリームです。通常はターミナル(モニタ)に表示されます。

ファイルディスクリプター:

使用例:

 「echo "Hello, World!"」は、「"Hello, World!"」という文字列を標準出力に出力します。この場合、標準出力はターミナルに表示されるため、ユーザーがその内容を確認できます。

user01@ubuntu-vm:~$ echo "Hello, World!"
Hello, World!

標準エラー出力(stderr)

定義: 標準エラー出力は、プログラムがエラーメッセージなどを表示するための出力ストリームです。これも通常はターミナル(モニタ)に表示されますが、標準出力とは独立して扱われます。

ファイルディスクリプター:

使用例:

 「ls non_existent_file」とすると、存在しないファイルに対するエラーメッセージが標準エラー出力に表示されます。

user01@ubuntu-vm:~$ ls non_existent_file
ls: 'non_existent_file' にアクセスできません: そのようなファイルやディレクトリはありません

標準入出力のファイルディスクリプター

Linuxでは、各標準入出力に対して以下のファイルディスクリプターが割り当てられています。

  • 0: 標準入力(stdin)
  • 1: 標準出力(stdout)
  • 2: 標準エラー出力(stderr)

 これらのファイルディスクリプターは、プログラム内やシェルスクリプトでリダイレクトやパイプを使用する際に頻繁に活用されます。

例: リダイレクトとパイプ

標準出力のリダイレクト

 「echo "Hello, World!" > output.txt」は、「"Hello, World!"」をモニタ(ターミナル)ではなく「output.txt」ファイルに書き出します。「ls」コマンドを使うと「output.txt」ファイルが作成されていることが確認できます。

user01@ubuntu-vm:~$ echo "Hello, World!" > output.txt
user01@ubuntu-vm:~$ ls
output.txt  ダウンロード  デスクトップ  ビデオ    ミュージック
snap        テンプレート  ドキュメント  ピクチャ  公開

標準エラー出力のリダイレクト

 「ls non_existent_file 2> error.log」は、エラーメッセージをターミナルではなく「error.log」ファイルに書き出します。「ls」コマンドを使うと「error.log」ファイルが作成されていることが確認でき、「cat error.log」でエラーメッセージの内容を確認できます。。

user01@ubuntu-vm:~$ ls non_existent_file 2> error.log
user01@ubuntu-vm:~$ ls
error.log   snap          テンプレート  ドキュメント  ピクチャ      公開
output.txt  ダウンロード  デスクトップ  ビデオ        ミュージック
user01@ubuntu-vm:~$ cat error.log 
ls: 'non_existent_file' にアクセスできません: そのようなファイルやディレクトリはありません

パイプ

 「ls | grep "output"」は、「ls」コマンドの出力を「grep」コマンドに渡して、「output」という文字列を含む行を検索します。

user01@ubuntu-vm:~$ ls | grep "output"
output.txt

作成したファイルと作成されたファイルの削除

コマンドによって作成されたファイルを削除します。

・「rm output.txt error.log」コマンドを実行し、「ls」コマンドで削除されたかどうかを確認します。

user01@ubuntu-vm:~$ rm output.txt error.log 
user01@ubuntu-vm:~$ ls
snap          テンプレート  ドキュメント  ピクチャ      公開
ダウンロード  デスクトップ  ビデオ        ミュージック

まとめ

 これらの機能を駆使することで、Linuxユーザーやエンジニアは柔軟にデータの入出力を管理し、効率的に作業を進めることができます。