私は'というプログラムを書いています。ビデオ2png、ffmpeg
ビデオの一部のフレームをpngに変換するために使用します。
#!/bin/bash
ffmpeg -ss 30:00 -i "$1" -frames 1 -s 1280x880 -f image2 "$2"
ビデオパスと目的の出力パスを最初と2番目のパラメータとしてスクリプトに渡します。スクリプトが示すように、およびを介して"$1"
これら2つのパスを取得します"$2"
。 Macの端末で次のようにスクリプトを実行しています。
Path1="/Users/jintai/Downloads/demon/a b/demon.mp4"
Path2="/Users/jintai/Downloads/demon/a b/demon.png"
bash video2png "$Path1" "$Path2"
-frames
ただし、次のエラーメッセージが表示されるため、スクリプトのフラグパラメータがビデオパスの下のファイルffmpeg
として誤って解釈されているようです。
Trailing option(s) found in the command: may be ignored.
-frames: No such file or directory
この問題をどのように解決できますか?時間を割いてアドバイスありがとうございます!
編集:@muruの提案に従って、-x
afterを使用してスクリプトを実行しますbash
。しかし、問題はここに残っています。私の実行とすべての結果は次のとおりです。
(base) jintai@192 missing % bash -x video2png "$Path1" "$Path2"
+ ffmpeg -ss 30:00 -i -frames 1 -s 1280x880 -f image2
ffmpeg version 4.4.2 Copyright (c) 2000-2021 the FFmpeg developers
built with Apple clang version 13.0.0 (clang-1300.0.29.30)
configuration: --prefix=/opt/local --enable-swscale --enable-avfilter --enable-avresample --enable-libmp3lame --enable-libvorbis --enable-libopus --enable-librsvg --enable-libtheora --enable-libopenjpeg --enable-libmodplug --enable-libvpx --enable-libsoxr --enable-libspeex --enable-libass --enable-libbluray --enable-libzimg --enable-libzvbi --enable-lzma --enable-gnutls --enable-fontconfig --enable-libfreetype --enable-libfribidi --enable-zlib --disable-libjack --disable-libopencore-amrnb --disable-libopencore-amrwb --disable-libxcb --disable-libxcb-shm --disable-libxcb-xfixes --disable-indev=jack --enable-opencl --disable-outdev=xv --enable-audiotoolbox --enable-videotoolbox --enable-sdl2 --disable-securetransport --mandir=/opt/local/share/man --enable-shared --enable-pthreads --cc=/usr/bin/clang --enable-libdav1d --enable-libaom --enable-librav1e --enable-libsvtav1 --arch=x86_64 --enable-x86asm --enable-gpl --enable-postproc --enable-libx264 --enable-libx265 --enable-libxvid --enable-libvidstab
libavutil 56. 70.100 / 56. 70.100
libavcodec 58.134.100 / 58.134.100
libavformat 58. 76.100 / 58. 76.100
libavdevice 58. 13.100 / 58. 13.100
libavfilter 7.110.100 / 7.110.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 9.100 / 5. 9.100
libswresample 3. 9.100 / 3. 9.100
libpostproc 55. 9.100 / 55. 9.100
Trailing option(s) found in the command: may be ignored.
-frames: No such file or directory
編集:@Gilles 'SO - Stop the Evil'の提案に従って、ここにスクリプトを投稿しています。私は実際にBashを初めて学ぶ人であり、これをecho
スクリプトに使用します。最初の投稿の最初のコードブロックは、echo
私がスクリプトを書くために使用したものです。スクリプトは次のとおりです。
ビデオ2png。ご提案いただいた皆様に感謝します!もっと議論を楽しみにしています。
答え1
#!/bin/bash
ffmpeg -ss 30:00 -i "$1" -frames 1 -s 1280x880 -f image2 "$2"
質問に投稿されたスクリプトは、上記のコピーとまったく同じように見えます。 2つの引数を使用してスクリプトを呼び出すと、最初の引数は"$1"
(引用符のため)文字列に展開され、同様に2番目の引数も拡張されます"$2"
。
スクリプトを実行すると、video2png "$Path1" "$Path2"
完全に正しいように見えます。引用符は、スペースに関係なくファイル名をそのまま保持します。
逆に、スクリプトにffmpeg -ss 30:00 -i $1 -frames 1 ...
空の引数がある場合、または引数がまったくない場合は、次のように呼び出します。引用しない拡張機能は$1
実行と同様に完全に消えますffmpeg -ss 30:00 -i -frames 1 ...
。
次の 2 つのトレース出力と動作を比較します。
empty= bash -x -c 'ls "$empty"'
empty= bash -x -c 'ls $empty '
''
最初の項目はパラメータとして明示的に表示され、ls
動作は完全に異なる必要があります。
これで、何らかの理由で共有内のファイルは次のようになります。
#/bin/bash -c
ffmpeg -ss 30:00 -i -frames 1 -s 1280x880 -f image2
これはうまくいきません。まず、ハッシュバンラインが欠落している!
(爆発)。その後、このオプションは-c
コマンドラインから直接シェルコマンド(たとえば)を渡すために使用されますbash -c "echo foo"
。ハッシュバンラインでは動作しません。 (これbash video2png
を使用するのではなく、Bashを介してスクリプトを明示的に呼び出すため、./video2png
ハッシュバンは表示されません。)
$1
また、スクリプトにはコマンドライン引数への参照はまったくありません$2
。
たとえば、次を参照してください。