Linux/Unix での入力出力リダイレクトの例

⚡ スマートサマリー

Linux および Unix のリダイレクトは、コマンドが入力を読み取る場所、または出力を送信する場所、スワップを変更します。ping キーボードと画面を使用して、大なり記号、小なり記号、追加演算子などの演算子を使用するファイルまたはデバイスを操作します。

  • 🔀 リダイレクション: リダイレクトとは、コマンドの標準入力または標準出力を、キーボードや画面からファイルやデバイスに変更する機能です。
  • ➡ 出力: > 演算子は出力をファイルに書き込み、>> 演算子は既存のファイルを消去せずに追記します。
  • ⬅️ 入力: < 演算子は、キーボードの代わりにファイルをコマンドの標準入力として渡します。
  • 🔢 ファイルディスクリプタ: 開いているファイルにはそれぞれ番号が割り当てられます。標準入力には0、標準出力には1、標準エラー出力には2が割り当てられます。
  • ⚠️ エラーリダイレクト: 2> を使用すると、エラーメッセージが別のファイルに送信されるため、通常の出力が煩雑になるのを防ぐことができます。
  • 🔗 合流ストリーム: 2>&1構文は、標準エラーを標準出力と同じ対象にルーティングします。
  • 🤖 AIによる支援: AIアシスタントとGitHub Copilotは、リダイレクトコマンドやシェルスクリプトを作成して説明することができます。

LinuxおよびUnixにおける入出力リダイレクト(例付き)

リダイレクトは、 Linux Unixシェルは、コマンドの入力読み込み先と出力先を自由に指定できるため、非常に便利です。このページでは、出力、入力、エラーのリダイレクトについて、具体的な例を交えて解説します。

リダイレクトとは何ですか?

リダイレクトは、Linux の機能の一つで、コマンドを実行する際に標準入力デバイスと標準出力デバイスを変更できます。 Linuxコマンド それは、入力を受け取り、出力を与えるということです。

  • 標準入力 (stdin) デバイスはキーボードです。
  • 標準出力 (stdout) デバイスは画面です。

リダイレクトを使用することで、上記の標準入力と出力を変更できます。

出力リダイレクト

以下の図は、出力リダイレクトの例の開始点を示しています。

出力リダイレクトセクションの見出しグラフィック

'>'記号は、出力(標準出力)のリダイレクトに使用されます。

例:

ls -al > listings

ここでは、コマンド ls -al の出力が画面ではなく「listings」というファイルにリダイレクトされます。以下のスクリーンショットはその結果を示しています。

ls -al の出力結果がリストファイルにリダイレクトされたことを示すターミナル画面

注:コマンド出力をファイルにリダイレクトする際は、正しいファイル名を使用してください。同じ名前のファイルが既に存在する場合、リダイレクトされたコマンドはそのファイルの内容を削除してから上書きします。

既存のファイルを上書きせずにコンテンツを追加したい場合は、「>>」演算子を使用します。下のスクリーンショットは、「>>」を使用してコンテンツを追加した例です。

ターミナルに、二重大なり演算子を使用して既存のファイルにコマンド出力が追記された状態を表示している。

標準出力はファイルだけでなく、デバイスにもリダイレクトできます。

$ cat music.mp3 > /dev/audio

catコマンドはファイルmusicを読み込みます。mp3 そして、出力先をオーディオデバイスである /dev/audio に送信します。PC のサウンド設定が正しければ、このコマンドはファイル music を再生します。mp3.

入力リダイレクト

以下の図は、入力リダイレクトについて説明しています。

入力リダイレクトセクションの見出しグラフィック

「<」記号は、入力(標準入力)のリダイレクトに使用されます。

例:Linuxのメールプログラムを使えば、端末からメールを送信できます。

メールの内容は、標準入力デバイスであるキーボードを使って入力できます。しかし、メールにファイルを添付したい場合は、以下の形式で入力リダイレクト演算子を使用できます。

mail -s "Subject" to-address < Filename

以下のスクリーンショットは、メールコマンドがファイルを入力として読み込んでいる様子を示しています。

メールにファイルを添付するために入力リダイレクトを使用するメールコマンド

これによりファイルがメールに添付され、受信者に送信されます。

上記の例は単純なものでした。次に、ファイルディスクリプタを利用した高度なリダイレクト手法を見ていきましょう。

File Descriptまたは(FD)

LinuxやUnixでは、すべてがファイルです。通常のファイル、ディレクトリ、さらにはデバイスもファイルです。すべてのファイルには、ファイルディスクリプタ(FD)と呼ばれる番号が関連付けられています。

下の図は、標準ストリームとそのファイルディスクリプタを示しています。

標準入力、出力、エラー ストリームおよびそれらのファイル ディスクリプタの図

画面にもファイルディスクリプタがあります。プログラムが実行されると、出力は画面のファイルディスクリプタに送信され、モニターにプログラムの出力が表示されます。出力がプリンタのファイルディスクリプタに送信された場合、プログラムの出力は印刷されます。

エラーのリダイレクト

端末でプログラムやコマンドを実行する際には、常に3つのファイル、すなわち標準入力、標準出力、標準エラーが開かれます。

これらのファイルは、プログラムが実行される際には常に存在します。前述のとおり、これらのファイルそれぞれにファイルディスクリプタが関連付けられています。

File File Descriptor
標準入力STDIN 0
標準出力STDOUT 1
標準誤差STDERR 2

デフォルトでは、エラーメッセージは画面に表示されます。エラーリダイレクト機能を使用すると、エラーを画面以外のファイルにリダイレクトできます。

なぜエラーリダイレクトなのか?

エラーリダイレクトは、UnixおよびLinuxの非常に人気のある機能の1つです。

Unixを頻繁に利用するユーザーなら、多くのコマンドで大量のエラーが発生することをご存知でしょう。例えば、ファイルを検索すると、通常は次のようなエラーが発生します。 許可 拒否エラーは、通常、特定のファイルを探している人にとって何の役にも立ちません。シェルスクリプトを実行する際、通常のプログラム出力にエラーメッセージが大量に表示されるのは避けたいものです。

解決策は、エラーメッセージをファイルにリダイレクトすることです。

例

$ myprogram 2>errorsfile

以下のスクリーンショットは、ターミナルでこのコマンドを実行した様子を示しています。

ターミナルでmyprogramを実行し、標準エラーをerrorsfileファイルにリダイレクトします。

上記では、myprogram という名前のプログラムを実行しています。標準エラーのファイルディスクリプタは 2 です。「2>」を使用することで、エラー出力を「errorsfile」というファイルにリダイレクトしています。そのため、プログラムの出力がエラーで埋め尽くされることはありません。

例

以下は、find文を使用した別の例です。

find . -name 'my*' 2>error.log

findコマンドを使用して、現在のディレクトリ「.」内で「my」で始まる名前のファイルを検索し、発生したエラーをerror.logに送信します。

例3: より複雑な例を見てみましょう。

サーバー管理者は、ディレクトリの一覧を表示し、エラーと標準出力の両方をファイルに保存して後で処理することがよくあります。コマンドは次のとおりです。

ls Documents ABC> dirlist 2>&1

下の図は、両方のストリームが1つのファイルにキャプチャされる様子を示しています。

標準出力と標準誤差の図は両方ともファイルdirlistにリダイレクトされます

ここに:

  • 2>&1 は、STDERR が STDOUT (ファイル dirlist) と同じターゲットにリダイレクトされることを意味します。
  • エラー出力は標準出力にリダイレクトされ、さらに標準出力はファイルdirlistにリダイレクトされます。したがって、両方の出力ストリームがファイルdirlistに書き込まれます。

下の図は、入力、出力、およびエラーリダイレクトがどのように連携するかをまとめたものです。

LinuxおよびUnixにおける入力、出力、およびエラーリダイレクトをまとめた図

よくあるご質問

A パイプ (|) は、あるコマンドの出力を別のコマンドの入力として直接渡します。一方、リダイレクトはコマンドをファイルまたはデバイスに接続し、出力をそこに書き込んだり、入力をそこから読み込んだりします。パイプはコマンド同士を結合し、リダイレクトはコマンドとファイルを結合します。

> 演算子はコマンドの出力をファイルに書き込み、既存の内容を上書きします。 >> 演算子は代わりに出力をファイルの末尾に追加します。ping 既に存在する内容です。ファイルを上書きするのではなく、追加したい場合は、>> を使用してください。

/dev/null は、書き込まれた内容をすべて破棄する特殊なファイルです。コマンドに 2>/dev/null を追加すると、エラーメッセージがそのファイルにリダイレクトされ、エラーメッセージは黙って破棄されるため、画面には通常の出力のみが表示されます。これは、不要なエラーメッセージを隠す一般的な方法です。

teeコマンドは標準入力からデータを読み込み、画面と1つ以上のファイルに同時に書き込みます。例えば、`ls -al | tee listing.txt`のように使用します。このコマンドを使うと、コマンドの出力を画面に表示しながらファイルに保存することができます。

ヒアドキュメントは、<<演算子を使用して、指定したマーカーワードで終わる複数行のインラインテキストをコマンドへの入力として渡します。メール本文などの複数行の入力を別のファイルなしで渡す場合、シェルスクリプトで便利です。

出力リダイレクトの後に 2>&1 構文を使用します。例えば、`command > file 2>&1` のように記述すると、標準エラーが標準出力に続いてファイルに書き込まれます。最新の Bash では、`&> file` という短縮形コマンドで同じことができます。順序が重要です。出力リダイレクトの後に 2>&1 を配置してください。

AIアシスタントは、平易な英語のリクエストを正しいリダイレクトコマンドに変換したり、2>&1や&>などの演算子の機能について説明したり、実行前にエラーを警告したりすることができます。また、機械学習ツールは、リダイレクトされたログファイルやエラーファイルをスキャンして、手動レビューでは見逃してしまうような異常を検出します。

Yes. GitHubコパイロット 目的を説明する短いコメントから、入力、出力、エラーをリダイレクトするコマンドやスクリプトを生成し、入力に応じてそれらを補完することができます。 Rev提案されたコマンドをファイルに対して確認してください。特に、既存のデータを上書きする > を使用するコマンドは避けてください。