Linux – リダイレクトとパイプ

目次

概要

リダイレクトは、コマンドの出力や入力を別の場所に送るための方法で、UNIX や Linux のシステムで頻繁に使用されます。 また、パイプを使用することで、一つのコマンドの出力を別のコマンドの入力として渡すことができます。

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

標準入力 (standard input/stdin)、標準出力 (standard output/stdout)、標準エラー出力 (standard error/stderr)は、コンピュータープログラムが外部とのデータのやり取りを行うための基本的なストリームです。UNIX および Linux のシステムでは、ファイルディスクリプタ (File Descriptor, FD) を使用して、標準入力、標準出力、および標準エラー出力を参照します。これらのファイルディスクリプタには、それぞれ以下のように番号が割り当てられています:

  1. 標準入力 (stdin): ファイルディスクリプタ番号 0
  2. 標準出力 (stdout): ファイルディスクリプタ番号 1
  3. 標準エラー出力 (stderr): ファイルディスクリプタ番号 2

標準入力 (stdin)

標準入力は、プログラムが外部からデータを受け取るためのストリームです。通常、キーボードからの入力が標準入力となりますが、リダイレクトやパイプを使用してファイルや他のコマンドから入力を受け取ることもできます。

# `cat` コマンドで標準入力からデータを読み取る
cat

上記のコマンドを実行すると、ユーザーがキーボードから入力したテキストがそのまま出力されます。入力を終了するには、Ctrl+D を押します。

標準出力 (stdout)

標準出力は、プログラムが外部にデータを出力するためのストリームです。通常、コンソールに出力されますが、リダイレクトを使用してファイルや他のコマンドに出力を送ることもできます。

# `echo` コマンドで標準出力にデータを出力する
echo "Hello, World!"

上記のコマンドを実行すると、”Hello, World!” という文字列がコンソールに出力されます。

標準エラー出力 (stderr)

標準エラー出力は、プログラムがエラーメッセージや診断情報を出力するためのストリームです。標準出力とは別のストリームであり、通常はコンソールに出力されますが、リダイレクトを使用してファイルや他のコマンドに出力を送ることもできます。

# 存在しないファイルを読み込もうとしてエラーメッセージを標準エラー出力に出力する
ls non_existent_file

リダイレクト

リダイレクトは、コマンドの出力や入力を別の場所に送るための方法です。 通常、リダイレクトはファイルに対して行われます。主なリダイレクトの種類には以下のものがあります:

リダイレクト 説明
< ファイルから標準入力を読み込みます。
> または 1> 標準出力をファイルに上書きします。
>> または 1>> 標準出力をファイルに追記します。
2> 標準エラー出力をファイルに上書きします。
2>> 標準エラー出力をファイルに追記します。
&> 標準出力と標準エラー出力をファイルに上書きします。
&>> 標準出力と標準エラー出力をファイルに追記します。
2>&1 標準エラー出力を標準出力にリダイレクトします。
>&2 または 1>&2 標準出力を標準エラー出力にリダイレクトします。

使用例

  • <: sort < input.txtinput.txt の内容を標準入力として受け取り、ソートします。
  • > または 1>: echo "Hello, World!" > output.txt は “Hello, World!” を output.txt に上書きします。
  • >> または 1>>: echo "Hello, again!" >> output.txt は “Hello, again!” を output.txt に追加します。
  • 2>: ls non_existing_file 2> error.log はエラーメッセージを error.log に上書きします。
  • 2>>: ls another_non_existing_file 2>> error.log はエラーメッセージを error.log に追加します。
  • &>: command &> output_and_error.log は標準出力と標準エラー出力を output_and_error.log に上書きします。
  • &>>: command &>> output_and_error.log は標準出力と標準エラー出力を output_and_error.log に追加します。
  • 2>&1: command > output.log 2>&1 は標準エラー出力を標準出力にリダイレクトし、それを output.log に上書きします。

パイプ

パイプは、あるコマンドの標準出力を別のコマンドの標準入力として渡すために使用されます。 これにより、複数のコマンドを連結してデータを加工することができます。パイプは | 記号を使って表現されます。

データの連結処理

  • 複数のコマンドを連結し、一連のデータ処理を行うことができます。
cat filename.txt | grep "search_term" | sort

上記の例では、cat コマンドでファイル filename.txt の内容を表示し、その出力を grep コマンドに渡して search_term を含む行を抽出し、最終的に sort コマンドでソートします。

標準エラー出力をパイプに渡す (2>&1)

  • パイプには通常、標準出力のみが渡されますが、標準エラー出力を標準出力にリダイレクトすることで、両方の出力をパイプに渡すことができます。
command 2>&1 | tee combined.log

上記の例では、command の標準出力と標準エラー出力を両方とも tee コマンドに渡し、combined.log ファイルに保存しながら、同時にコンソールにも出力します。

tee コマンド

tee コマンドは、コマンドの標準出力をファイルに書き込みつつ、同時にその出力を標準出力にも表示するために使用されます。名前は、T 型配管に由来します。tee コマンドを使用することで、出力をリアルタイムで確認しながら、同時にファイルに保存することができます。

リダイレクトとパイプの違い

  • リダイレクト: コマンドの出力やエラーをファイルに書き出したり、ファイルから入力を読み取ったりするのに使用します。ファイルとのやり取りが主目的です。
  • パイプ: 一つのコマンドの出力を別のコマンドの入力として渡すのに使用します。複数のコマンドを連結してデータを処理するのが主目的です。

コメント

コメントする

目次