😺

Linuxさんで標準出力を消して表示エラー出力だけを表示する。

2021/01/03に公開

はじめに

くーばねてすをやっつけるためにLinuxさんと仲良くさせてもらっているが、Linuxさんは色んな方法で入出力できることが判明した!標準出力を消して表示エラー出力だけを表示することができるらしい。入出力ってなに!どんなときにつかうの?

概要

■標準入出力ってなに?
■リダイレクト
■リダイレクトの入力をまとめる
■リダイレクトを使ってエラーメッセージだけを表示させる

標準入出力ってなに?

■標準入力(stdin)

プログラムの標準的な入力のこと。標準ではキーボードが使われる。

■標準出力(stdout)

プログラムの標準的な出力のこと。標準ではディスプレイが使われる。

■標準エラー出力(stderr)

エラーメッセージを出力する標準的な出力のこと。標準ではディスプレイが使われる。
標準多すぎ!標準ばっかり何?(+o+)
なんで標準という言葉をこんなに並べるのかというと、パソコンさんからすると各コマンドから必ずしも「キーボードから」「ディスプレイへと」入出力されている!とは考えていないから。
パソコンさんからするとファイルやプリンタでもなんでも構わない。
標準入出力先は自由に設定することができる。
なのでLinuxさんでは柔軟に入出力先を変更できる、という意味で抽象化して標準入出力という。

リダイレクト~標準入出力を変更してみる~

↑で説明した通り、標準入出力先は柔軟に変更することができる。
標準入出力は↑で説明した通り、
・標準入力
・標準出力
・標準エラー出力
の3つが設定できる。

■標準入力をリダイレクトしてみる

キーボードでなく、ファイルを標準入力先にしてみる。
標準入力リダイレクトは<を使う。入力はく!!!

$ cat < .bash_history
ls -l test.txt
chmod u+x test.txt
ls -l test.txt
chmod g+r tst.txt
chmod g+r test.txt
ls -l test.txt
略

ン?
$ cat .bash_history

$ cat < .bash_history
なにが違うの?
$ cat .bash_historyはcatコマンドのファイル指定されたときの内容を対象とする、という動作が実行されている。
$ cat < .bash_historyは標準入力を標準出力として表示する、という動作が実行されている。
らしい。よくわからん(+o+)wがそういうことだそうだ。

■標準出力をリダイレクトしてみる

標準出力リダイレクトは>を使う。出力はくの反対!!!
↓lsコマンドの実行結果(出力)を標準のディスプレイでなくファイルに変更する。

$ ls -l / > list.txt
$ cat list.txt
total 16
dr-xr-xr-x 18 root root  257 Nov 20 03:25 .
dr-xr-xr-x 18 root root  257 Nov 20 03:25 ..
-rw-r--r--  1 root root    0 Nov 20 03:25 .autorelabel
lrwxrwxrwx  1 root root    7 Nov 13 03:33 bin -> usr/bin
略

「>」で出力するとコマンドの実行結果だけが上書き保存されるので気をつけてね。
↓コマンドの実行結果をファイル末尾に追記したい時は「>>」を使う。

$ ls -l / >> list.txt

vimコマンドのように自動的にファイルが生成されるので、touchコマンドでファイルを作っておく必要はない。
誤ってリダイレクトで上書きをしないようにするには、シェルのオプションnoclobberをsetコマンドで設定することで防ぐことできる。

$ set -o noclobber
$ ls -l > list.txt
-bash: list.txt: cannot overwrite existing file

■標準エラー出力をリダイレクトしてみる

↓標準エラー出力

$ ls xxxxx
ls: cannot access xxxxx: No such file or directory

標準エラー出力は2>を使う。エラーはツーくの反対!!!
↓標準エラー出力をerror.txtにエラー出力してみる

$ ls xxxxx 2> error.txt
$ cat error.txt
ls: cannot access xxxxx: No such file or directory

できた!
↓ちなみに標準出力だけリダイレクトしてもエラーメッセージは入らない('_')確認のため

$ ls xxxxx > error.txt
ls: cannot access xxxxx: No such file or directory

一気に標準出力と標準エラー出力をそれぞれのファイルにリダイレクトすることもできる。

$ ls xxxxx > list.txt 2> error.txt

標準出力と標準エラー出力をリダイレクトすると画面には何も出力されなくなる。
↓標準出力と標準エラー出力をひとつのファイルにリダイレクトすることもできるぞ.
標準出力をリダイレクトした後に2>&1と入力する。

$ ls xxxxx >result.txt 2>&1

2>(標準エラー出力)を&1(標準出力と同じものへ)という意味らしい。
Linuxさんでは標準入出力を数値で管理していて
標準入力を0
標準出力を1
標準エラー出力を2
としているからだ。

リダイレクトの入力をまとめる

記号 内容
< 標準入力をファイルに変更
> 標準出力をファイルに変更
>> 標準出力をファイルの末尾に追記
2> 標準エラー出力をファイルに変更
2>> 標準エラー出力をファイルの末尾に追記
> ファイル 2>&1 標準エラー出力と標準出力をファイルに変更する

リダイレクトを使ってエラーメッセージだけを表示させる

Linuxさんで標準出力を消して表示エラー出力だけを表示するには!

じつはLinuxさんには/dev/nullファイルというスペシャルファイルというのがあって、このファイルは入出力先として指定してもなにも出力せず、データは保存されず消えてなくなるらしいのだ!
今回はそんな/dev/nullというスペシャルファイルを使って、長ったらしい実行結果(標準出力)を消して、エラーメッセージだけ読み取れるようにしようと思う。
↓/とxxxxxをls-lコマンドで一覧表示してみる。

$ ls -l / xxxxx
ls: cannot access xxxxx: No such file or directory
/:
total 16
dr-xr-xr-x 18 root root  257 Nov 20 03:25 .
dr-xr-xr-x 18 root root  257 Nov 20 03:25 ..
-rw-r--r--  1 root root    0 Nov 20 03:25 .autorelabel
lrwxrwxrwx  1 root root    7 Nov 13 03:33 bin -> usr/bin
dr-xr-xr-x  4 root root 4096 Jan  1 15:57 boot
略

長い標準出力を/dev/nullファイルにおくり、
ls: cannot access xxxxx: No such file or directoryというエラーメッセージを出力する。

$ ls -l / xxxxx > /dev/null
ls: cannot access xxxxx: No such file or directory

標準出力が消えてエラーメッセージだけ出力された!

どんなときに使うの?

あらかじめわかっている長い出力を非表示にする時に役に立つはず!きっと!😢きっと!

まとめ

お正月やすみが短い(+o+)!

Discussion