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-停止邪恶'的建议,我在这里发布了我的脚本。实际上我是 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选项用于直接从命令行传递 shell 命令,例如bash -c "echo foo"。它在 hashbang 行中不起作用。 (话又说回来,您通过 Bash 显式调用了该脚本,而bash video2png不是仅使用./video2png,因此 hashbang 不会出现在其中。)

$1此外,该脚本完全缺少对命令行参数的引用$2

另请参见例如:

相关内容