外部调用脚本不起作用


8

我使用一个简单的脚本从.mp4文件创建.mp3:

#!/bin/bash
for i in *.mp4
do
ffmpeg -i "$i" -ab 128k "${i%mp4}mp3"
done

从桌面运行或通过终端调用时,脚本运行良好。但是,从外部脚本调用该脚本时,该脚本无法运行,返回

“ * .mp4:无此类文件或目录”。

我怀疑问题出在外壳扩展上,但无法解决这种情况。

Answers:


13

您正在使用相对路径,您的脚本在其中寻找.mp4当前目录中的文件,即运行脚本的目录,并发现不.mp4存在此类文件,然后寻找文字*.mp4文件(假设nullglob/ failglob不是设置(默认设置),并且该文件也不存在,因此出现错误消息*.mp4: No Such File or Directory

您应该改用绝对路径:

for i in /directory/*.mp4; do ...; done

替换/directory/为实际目录路径;如果需要,也可以将目录名称作为第一个参数:

for i in "$1"/*.mp4; do ...; done

您可以在此处使用绝对路径或相对路径,但绝对路径始终是更安全的选择。

现在以通常的方式调用可执行脚本:

/path/to/script.sh /directory

从脚本目录:

./script.sh /directory

谢谢您的帮助。想要告诉您我已经尝试了失败,但是随后发现我第一次在“ / home”中大写了“ H”。将路径作为参数传递特别有用。干杯。
M. Street

“因此出现错误消息”的实际含义是:由于外壳无法与*.mp4任何文件匹配,因此将其视为文字文件名,并尝试打开名为*.mp4(有效的文件名)的文件,但由于没有文件而失败*.mp4在当前目录中调用。有人可能会认为*.mp4总是扩展到匹配文件名列表,该文件名可以为空(在这种情况下,for循环将不执行任何操作,但不会引发任何错误),事实并非如此:*.mp4总是扩展为某种文件名。
Bakuriu

@Bakuriu在这种情况下(或在中默认bash)是正确的,但并非总是如此;看nullglob/ failglob
heemayl

我出错了,是在考虑“ *”仅用于文件名,而不是路径和文件名的组合。生活和学习:)
M. Street,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.