bashやzshでシェル芸(ワンライナー)を書いてたりすると、標準エラー出力だけを/dev/nullに出力させたりといった処理を行うことがある。 で、毎回いちいち/dev/nullとか指定するのもあれなんで、省略記述方法ないかなと思って調べてみたところ、Bash4以降だと結構記述方法が増えたようだ。 個人的によく利用する記述の省略形だけピックアップして記述しておく。
2> /dev/null
標準エラー出力や標準出力、どっちかだけを非表示にさせたい場合だと「2>/dev/null」と記述して/dev/nullにリダイレクトさせるのだが、以下のようにも書けるようだ。
2>/dev/null
2>&-
blacknon@BS-PUB-UBUNTU-01:~$ ls -la aaa a
ls: 'a' にアクセスできません: そのようなファイルやディレクトリはありません
-rw-rw-r-- 1 blacknon blacknon 254 3月 13 2016 aaa
blacknon@BS-PUB-UBUNTU-01:~$
blacknon@BS-PUB-UBUNTU-01:~$ ls -la aaa a 2>/dev/null
-rw-rw-r-- 1 blacknon blacknon 254 3月 13 2016 aaa
blacknon@BS-PUB-UBUNTU-01:~$
blacknon@BS-PUB-UBUNTU-01:~$ ls -la aaa a 2>&-
-rw-rw-r-- 1 blacknon blacknon 254 3月 13 2016 aaa
blacknon@BS-PUB-UBUNTU-01:~$
blacknon@BS-PUB-UBUNTU-01:~$ ls -la \-
ls: '-' にアクセスできません: そのようなファイルやディレクトリはありません
2>&1 | Command ...
標準エラー出力も含めてパイプで次のコマンドに渡す場合。
以下のようにも記述できる。
2&>1 | Command ...
|& Command ...
blacknon@BS-PUB-UBUNTU-01:~$ ls -la aaa a 2>&1 | grep -e ls -e $
ls: 'a' にアクセスできません: そのようなファイルやディレクトリはありません
-rw-rw-r-- 1 blacknon blacknon 254 3月 13 2016 aaa
blacknon@BS-PUB-UBUNTU-01:~$
blacknon@BS-PUB-UBUNTU-01:~$ ls -la aaa a |& grep -e ls -e $
ls: 'a' にアクセスできません: そのようなファイルやディレクトリはありません
-rw-rw-r-- 1 blacknon blacknon 254 3月 13 2016 aaa
同様の考え方で、「>&」で1,2ともにリダイレクトが行える。
cat /dev/null > Path
「/dev/null」からリダイレクトをして空ファイルを作ったり中身を削除する場合。 こういった場合は、以下のようにも書けるようだ。「:」はヌルコマンドなので、それを利用すればよい。
cat /dev/null > Path
: > Path
blacknon@BS-PUB-UBUNTU-01:~$ grep "" a_test{1,2}.txt
a_test1.txt:test
a_test2.txt:test
blacknon@BS-PUB-UBUNTU-01:~$
blacknon@BS-PUB-UBUNTU-01:~$ cat /dev/null > a_test1.txt
blacknon@BS-PUB-UBUNTU-01:~$ cat a_test1.txt
blacknon@BS-PUB-UBUNTU-01:~$
blacknon@BS-PUB-UBUNTU-01:~$ : > a_test2.txt
blacknon@BS-PUB-UBUNTU-01:~$ cat a_test2.txt
大体、こんなとこだろうか。
結構省略して書くことができるみたいだ。
参考
- Advanced Bash-Scripting Guide: I/O Redirection
- shell - Difference between 2>&-, 2>/dev/null, |&, &>/dev/null and >/dev/null 2>&1 - Unix & Linux Stack Exchange