動かざることバグの如し

近づきたいよ 君の理想に

bashのメッセージ出力関連のメモ

そもそも

  • 標準出力:echoを含めたフツーのメッセージの出力 1番
  • 標準エラー出力:エラーメッセージの出力 2番
  • リダイレクト:いわゆる> 本来ターミナル上に表示される出力を指定ファイルに繋ぎかえること

sample

以下のrun.shを用意する

#!/bin/bash

echo 'hello'
cd /nodir
echo 'world'

何も指定せずに出力

端末上には標準出力と標準エラー出力の両方が表示される

user@ubuntu:~$ ./run.sh
hello
./run.sh: line 4: cd: /nodir: No such file or directory
world

標準出力のリダイレクト

端末上に表示されるのは標準エラー出力のみ、指定ファイル先には標準出力のみ

user@ubuntu:~$ ./run.sh > log
./run.sh: line 4: cd: /nodir: No such file or directory
user@ubuntu:~$ cat log
hello
world

標準エラー出力のリダイレクト

さっきと逆。

user@ubuntu:~$ ./run.sh 2> log
hello
world
user@ubuntu:~$ cat log
./run.sh: line 4: cd: /nodir: No such file or directory

標準出力と標準エラー出力のリダイレクト

標準出力をoutlogへ、標準エラー出力errlogに ターミナル上には何も表示されない

user@ubuntu:~$ ./run.sh > outlog 2> errlog
user@ubuntu:~$ cat outlog
hello
world
user@ubuntu:~$ cat errlog 
./run.sh: line 4: cd: /nodir: No such file or directory

標準出力と標準エラー出力を同一ファイルへ出力したい場合

上と同じようにやってもうまくいかない

user@ubuntu:~$ ./run.sh > log 2> log
user@ubuntu:~$ cat log
./run.world
ne 4: cd: /nodir: No such file or directory

標準出力と標準エラー出力を同じファイルに出力するには2>&1というのを利用する

user@ubuntu:~$ ./run.sh > log 2>&1
user@ubuntu:~$ cat log
hello
./run.sh: line 4: cd: /nodir: No such file or directory
world

略記法として&>もしくは>&がある(どっちでも可) こっちのほうが一般的

user@ubuntu:~$ ./run.sh &> log
user@ubuntu:~$ cat log
hello
./run.sh: line 4: cd: /nodir: No such file or directory
world

「2>&1」の意味

  • 2 の出力を 1 の出力とマージしたものにする ←まちがい
  • 2 の出力先を 1 の出力先と同じに設定する