Linux

標準エラー出力を標準出力に向けるコマンド

投稿日:2022年2月9日 更新日:

1. 本題

Linux でのターミナル操作において「標準エラー出力へ出力される内容を、標準出力に出力したい」という場合は、以下のようにコマンドを実行します(Bash シェルを想定しています)。

$ command 2>&1

「&」は、「>」の後ろについているというよりは「1」の頭についています。これは「1」がファイル名ではないことを表明するための記法です。

ちなみ、ファイル記述子1は「標準エラー出力」、2は「標準エラー出力」と決まっています。

※ ファイル記述子は、ファイルを参照するための番号です。主にC言語でファイルを扱う場合に使用します。

2. この記述を覚えるための補足

内部的には、dup2 というシステムコールを実行しているようです。

私は システムコールについて詳しくはないのですが、この動作に関して自分の認識している内容を以下に記録しておきます。間違いがあればご指摘ください。

  1. まず、ファイル記述子「1」は標準出力を、ファイル記述子「2」は標準エラー出力を指しています。
  2. dup(1, 2) が実行されます。
  3. これにより、ファイル記述子「1」がファイル記述子「2」に複製されます。もともとあったファイル記述子「2」の方は閉じられます。
  4. 以後、ファイル記述子「1」への書き込みも、ファイル記述子「2」への書き込みも、標準出力への書き込みになります。
ファイル記述子の変化

この動作をコマンドとして見ると、「ファイル記述子 2 がファイル記述子 &1 に リダイレクト (>) している」と捉えることができるので、「2>&1」という記述になる。と理解すればこの記述が覚えやすくなるのではないでしょうか。

📂-Linux

執筆者:labo


comment

メールアドレスが公開されることはありません。

関連記事

Linux

Ubuntu: タブ補完が効かなくなった場合の対処法 (bash)

Ubuntu: タブ補完が効かなくなった場合の対処法 (bash)について説明します。

Linux

コマンドラインからメールを送信する方法

Linux (や Mac) のターミナルエミュレータ上からメールを送信するコマンドを紹介します。 目次1. sendmail2. mail3. telnet4. おわりに 1. sendmail se …

Linux

環境変数PATHにセットされたパスを1行毎に表示する

環境変数PATHにセットされたパスを1行毎に表示する方法について説明しています。

SELinux

Webサーバーがサイトの構成ファイルを上書きできない問題に対応する(SELinuxが原因の場合)

目次1. はじめに2. 前提3. CentOS 7 の SELinux4. 対応手順5. おわりに参考 1. はじめに Webサイトによっては、そのWebサイトを構成しているファイルを自分で更新する場 …

Let's Encrypt

Let’s Encrypt でワイルドカードを使う

手持ちの CentOS 7 に入れてある certbot パッケージが バージョン 0.22.0 になり、Let’s Encrypt のワイルドカードに対応しましたので試してみました。 目 …