シェルが出す標準エラー出力を黙らせる

TL; DR
コマンドを (...)
で囲んで,後ろに 2>/dev/null
を足す.例えばこう.
(ffmpeg -i ${1} -vf "palettegen" -y ~/palette.png) 2>/dev/null
仕組み?
あまり詳しいことを理解してやったわけじゃない (いわゆるコピペプログラミング的) から,最善の方法じゃないかもしれない.でもサブシェルという仕組みを使用すると出力を黙らせることが出来るっぽい.
サブシェルとは、シェル (sh や csh など) から起動された子プロセスのシェルのことである。特に、シェルスクリプト上から起動したシェルのことをサブシェルと呼ぶことが多い。
用語集:サブシェル: UNIX/Linuxの部屋
何を言ってるのか僕はよく分かってない.子プロセスという言葉の響きからニュアンスを想像してるけど,正確な理解はまた気になったときに調べ直すことにしよう.なぜサブシェルを使うのかというと,この記事を参考にしたから.
コマンド自体が出すメッセージではなくシェルが出すメッセージは
2>/dev/null
で消すことはできませんが、その行全体をサブシェルにしてしまえば全体に2>/dev/null
をつけることで表示されなくできます。“echo off”の動きをLinuxのシェルスクリプトで実現 【OKWAVE】
(
#エラーメッセージを出したくない行
) 2>/dev/null
サブシェルで実行しないと, ffmpeg
のログを非表示にできなかったのでこうしました.
なんで突然 ffmpeg
?
例えば僕は以前 ffmpeg
を使ってMP4動画をGIFアニメに簡単に変換するスクリプトを書いた.それを黙らせたいというのが,これを調べたきっかけなのでした.そのときに書いたのは,こんなスクリプトでした.
#!/bin/sh
ffmpeg -i ${1} -vf "palettegen" -y ~/palette.png
ffmpeg -i ${1} -i ~/palette.png -lavfi "fps=12,scale=900:-1:flags=lanczos [x]; [x][1:v] paletteuse=dither=bayer:bayer_scale=5:diff_mode=rectangle" -y ${1}.gif
rm ~/palette.png
詳しいことは元の記事を見てくださいな.ffmpeg
はおしゃべりなコマンドで,実行時にいろんなことをコンソールにログ出力してくれる.でも僕の場合,どうせ読まないし,困ったときはその時に改めてログ出力させればいいかなと思った.なのでログを黙らせたかった.というわけで,今回このように変えました.
#!/bin/sh
(ffmpeg -i ${1} -vf "palettegen" -y ~/palette.png) 2>/dev/null
(ffmpeg -i ${1} -i ~/palette.png -lavfi "fps=12,scale=900:-1:flags=lanczos [x]; [x][1:v] paletteuse=dither=bayer:bayer_scale=5:diff_mode=rectangle" -y ${1}.gif) 2>/dev/null
rm ~/palette.png