bashスクリプトのフラグ引数がファイルとして誤って解釈されました。 「該当するファイルやディレクトリはありません。」

bashスクリプトのフラグ引数がファイルとして誤って解釈されました。 「該当するファイルやディレクトリはありません。」

私は'というプログラムを書いています。ビデオ2pngffmpegビデオの一部のフレームを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の提案に従って、-xafterを使用してスクリプトを実行します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

たとえば、次を参照してください。

関連情報