bashに長いコマンドを入力する際に改行して見やすくする方法

要約

bashに長いコマンドを入力するときに読みやすくするよう改行するには、改行したい箇所で
バックスラッシュ \
を入力してエンターキーを押すと続けて次の行にコマンドを書いていくことが出来ます。。


$ echo "abcd" "efgh" "1234"
と入力するときに改行するには
$ echo \
"abcd" \
"efgh" \
"1234"

となります。端末上で直接行を分ける以外に、テキストエディターでコマンドを複数行に分けて編集してそのままペーストする場合でも使えます。

 参考 : linux - How do I paste multi-line bash codes into terminal and run it all at once? - Stack Overflow

解説

Linuxの端末(ここではbashを使うことを想定)で、コマンドを入力するときにいろいろオプションを指定しているとやたら長くなって読み難くなることがあります。
例えばffmpegで複数の動画を合成したいとき、以下のようなコマンドを入力します。
$ ffmpeg -i wall02.png -i 001.mp4 -i 002.mp4 -i 003.mp4 -i 004.mp4 -filter_complex "nullsrc=size=1920x1080 [base]; [0:v] setpts=PTS-STARTPTS, scale=1920x1080 [background]; [1:v] setpts=PTS-8/TB, scale=900x500 [1/4]; [2:v] setpts=PTS-10/TB, scale=900x500 [2/4]; [3:v] setpts=PTS-5/TB, scale=900x500 [3/4]; [4:v] setpts=PTS-4/TB, scale=900x500 [4/4]; [base][background] overlay=1 [tmp1]; [tmp1][1/4] overlay=shortest=1:x=30:y=20 [tmp2]; [tmp2][2/4] overlay=shortest=1:x=960+30:y=20 [tmp3]; [tmp3][3/4] overlay=shortest=1:x=30:y=540+20 [tmp4]; [tmp4][4/4] overlay=shortest=1:x=960+30:y=540+20" -c:v libx264 output.mp4
これ、ブラウザ上では複数行に見えますが実際は1行の入力です。

方法

コマンドもこれだけの長さになると端末上で編集するのは結構手間です。
テキストエディター上で複数行に分割して書いて、編集してから端末にペーストすればいいのですが、改行があると端末上では一行ずつ実行されてしまいます。その場合、運が悪いと予期せぬコマンドが実行されてしまい良からぬ事態になりかねません。

エディター上で複数行に書いていったコマンドをそのまま端末に貼り付けたい場合は行末にバックスラッシュを付けてやればよいです。

先ほどのコマンドを行末にバックスラッシュを付けて書き直すと以下のようになります。
$ ffmpeg \
-i wall02.png \
-i 001.mp4 \
-i 002.mp4 \
-i 003.mp4 \
-i 004.mp4 \
\
-filter_complex "nullsrc=size=1920x1080 [base]; \
[0:v] setpts=PTS-STARTPTS, scale=1920x1080 [background]; \
[1:v] setpts=PTS-8/TB, scale=900x500 [1/4]; \
[2:v] setpts=PTS-10/TB, scale=900x500 [2/4]; \
[3:v] setpts=PTS-5/TB, scale=900x500 [3/4]; \
[4:v] setpts=PTS-4/TB, scale=900x500 [4/4]; \
\
[base][background] overlay=1 [tmp1]; \
[tmp1][1/4] overlay=shortest=1:x=30:y=20 [tmp2]; \
[tmp2][2/4] overlay=shortest=1:x=960+30:y=20 [tmp3]; \
[tmp3][3/4] overlay=shortest=1:x=30:y=540+20 [tmp4]; \
[tmp4][4/4] overlay=shortest=1:x=960+30:y=540+20" \
\
-c:v libx264 output.mp4 \

だいぶ読みやすくなりました。ffmpegコマンドのファイル入力、動画情報指定、動画合成指定をそれぞれ分けて書けるのでコマンドの編集作業もだいぶ楽になります。編集後にエディターに書いたのをそのままコピーし、端末にペーストして実行すればいいだけです。

ここまで長いコマンドを書くということはあまりないかも知れませんが、テクニックの一つとして覚えておくのもいいかと思います。

コメント