Linuxのコマンド入力はマウス操作に慣れている私たちにとっては、とっつきにくいもの。当記事は、Linuxをこれから学習していこうという方に向けて機能をわかりやすくご紹介いたします。
標準入力、標準出力
コンピュータの世界には、「入力」→「処理」→「出力」という基本的な流れがありますが、Linuxのコマンドも同様で、下図のようにコマンドが入力データを受け取って、処理した結果を出力するという流れがあります。この流れをストリームと呼びます。
この時、特に指定しなかった場合に利用されるデータの入力元を標準入力、データの出力先を標準出力と呼んでいます。また、エラーが発生した場合のエラーメッセージは、標準エラー出力として別に扱われています。
Linuxはストリームを番号で識別しており、デフォルト設定と合わせると下表のようになります。
番号 | デフォルト | |
---|---|---|
標準入力 | 0 | キーボード |
標準出力 | 1 | 端末画面 |
標準エラー出力 | 2 | 端末画面 |
基本的にLinuxのコマンドは、標準入力、標準出力、標準エラー出力を処理するように作られていますが、コマンドによっては、標準入力を受け取らないものや標準出力を行わないものもあります。
lsコマンドやdateコマンドを実行すると端末に結果が表示されますが、mkdirコマンドやtouchコマンドを実行しても端末には何も表示されません。
リダイレクト
リダイレクト記号を使用するとストリームの入出力先を変更することができます。この機能をリダイレクト、またはリダイレクションと呼びます。
例)catで開いたファイル内容を、他のファイルに書き込む。(標準出力のリダイレクト)
1 2 3 |
[shell] $ cat /etc/passwd > passwd.bak [/shell] |
リダイレクト記号の基本的な書式は次のようになります。
書式 | 説明 | |
---|---|---|
① | コマンド > file | コマンドの標準出力をfileに書き込む |
② | コマンド >> file | コマンドの標準出力をfileに書き足す |
③ | コマンド < file | コマンドはfileの内容を標準入力として受け取る |
④ | コマンド 2> file | コマンドの標準エラー出力をfileに書き込む |
⑤ | コマンド > file 2>&1 | 標準エラー出力の出力先を、標準出力の出力先と同じとする |
ここでいうコマンドとは、それぞれリダイレクトするストリームに対応したコマンドであればなんでもかまいません。
例①
1 2 3 4 5 6 7 8 |
[shell] $ echo sample &gt; sample1.txt $ cat sample1.txt sample $ echo sample1です &gt; sample1.txt $ echo sample1.txt sample1です [/shell] |
リダイレクト記号「>」を使用するとコマンドの標準出力を指定したファイルに書き込むことができます。しかし、その際既存のファイルを指定した場合、確認なしで上書きされてしまい、元のデータが消えてしまいますので注意が必要です。
リダイレクト記号「>」は「1>」の「1(標準出力の番号)」を省略したものです。
例②
1 2 3 4 5 6 |
[shell] $ echo sample2ではありません &gt;&gt; sample1.txt $ cat sample1.txt sample1です sample2ではありません [/shell] |
リダイレクト記号「>>」を使用すると出力のリダイレクトを行う際に上書きせず、既存のデータの末尾に追記する形になります。
例③
1 2 3 4 5 |
[shell] $ cat &lt; sample1.txt sample1です sample2ではありません [/shell] |
リダイレクト記号「<」を使用すると標準入力の代わりに指定したファイルの中身を入力データとして処理します。
リダイレクト記号「<」は「0<」の「0(標準入力の番号)」を省略したものです。
例④-1
1 2 3 4 5 6 7 8 |
[shell] $ cat @@@ 2&gt; err.txt $ cat err.txt cat: @@@: そのようなファイルやディレクトリはありません $ cat sample1.txt 2&gt; err.txt sample1です sample2ではありません [/shell] |
リダイレクト記号「2>」を使用するとエラー発生時のメッセージ(標準エラー出力)を指定したファイルに書き込みます。しかし、あくまでエラー出力のみを対象とするので、エラーが発生しない場合は、標準出力として端末にコマンドの結果が表示され、指定したファイルには、空のデータが書き込まれるため、指定したファイルは空ファイルになります。
例④-2
1 2 3 4 5 6 7 |
[shell] $ cat sample1.txt @@@ 2&gt; err.txt sample1です sample2ではありません $ cat err.txt cat: @@@: そのようなファイルやディレクトリはありません [/shell] |
この場合、”sample1.txt”は存在するファイルなので、標準出力に出力され、”@@@”は存在しないファイルのため、エラーメッセージが出力されますが、「2>」のリダイレクトにより”err.txt”にエラーメッセージが出力されます。
例⑤
1 2 3 4 5 6 7 |
[shell] $ cat sample1.txt @@@ &gt; result.txt 2&gt;&amp;1 $ cat result.txt sample1です sample2ではありません cat: @@@: そのようなファイルやディレクトリはありません [/shell] |
リダイレクト記号「2>&1」を使用することにより、標準エラー出力は、標準出力と同じ場所にリダイレクトされます。
この場合、左側の「>」によって標準出力は、”result.txt”にリダイレクトされているので、標準エラー出力も同じく”result.txt”にリダイレクトされます。
いかがでしたでしょうか。
Linuxは基本的にマウス操作をすることがありませんので、はじめは文字(コマンド)入力でのコンピュータ操作に戸惑うかもしれません。
慣れるまで何度も何度も繰り返して練習しましょう。