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

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 をつけることで表示されなくできます。

(
#エラーメッセージを出したくない行
) 2>/dev/null

“echo off”の動きをLinuxのシェルスクリプトで実現 【OKWAVE】

サブシェルで実行しないと, 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

コメントを残す

Powered by WordPress.com. テーマ: Baskerville 2 by Anders Noren

ページ先頭へ ↑

%d人のブロガーが「いいね」をつけました。