bash 스크립트의 플래그 인수가 파일로 잘못 해석되었습니다. "해당 파일 또는 디렉터리가 없습니다."

bash 스크립트의 플래그 인수가 파일로 잘못 해석되었습니다. "해당 파일 또는 디렉터리가 없습니다."

나는'이라는 프로그램을 작성 중입니다.비디오 2png, ffmpeg비디오의 일부 프레임을 png로 변환하는 데 사용합니다.

#!/bin/bash
ffmpeg -ss 30:00 -i "$1" -frames 1 -s 1280x880 -f image2 "$2"

비디오 경로와 원하는 출력 경로를 첫 번째 및 두 번째 매개변수로 스크립트에 전달합니다. 스크립트에서 볼 수 있듯이 "$1"및 를 통해 이 두 경로를 얻습니다 "$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"

질문에 게시된 스크립트는 위에 복사한 스크립트와 정확히 동일해 보입니다. 두 개의 인수를 사용하여 스크립트를 호출하면 첫 번째 인수는 "$1"(따옴표로 인해) 문자열 로 확장되고 마찬가지로 두 번째 인수도 로 확장됩니다 "$2".

스크립트를 실행하면 video2png "$Path1" "$Path2"완전히 올바른 것처럼 보입니다. 따옴표는 공백에 관계없이 파일 이름을 그대로 유지합니다.

반대로, 스크립트에 ffmpeg -ss 30:00 -i $1 -frames 1 ...빈 인수가 있거나 인수가 전혀 없는 경우 호출하면 다음과 같습니다.인용되지 않음확장 프로그램은 $1실행과 마찬가지로 완전히 사라집니다 ffmpeg -ss 30:00 -i -frames 1 ....

다음 두 가지의 추적 출력과 동작을 비교하십시오.

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

이것은 작동하지 않습니다. 우선, hashbang 라인이 누락되었습니다 !(폭발됨). 그런 다음 이 옵션은 -c명령줄에서 직접 셸 명령(예: )을 전달하는 데 사용됩니다 bash -c "echo foo". 해시뱅 라인에서는 작동하지 않습니다. (그런 다음 bash video2png를 사용하는 것이 아니라 Bash를 통해 명시적으로 스크립트를 호출하므로 ./video2png해시뱅이 표시되지 않습니다.)

$1또한 스크립트에는 명령줄 인수에 대한 참조가 전혀 없습니다 $2.

예를 들면 다음을 참조하세요.

관련 정보