命令在Linux终端中运行,但不在bash脚本中运行
我想自动修复一些视频的索引过程。下面是我的代码命令在Linux终端中运行,但不在bash脚本中运行,bash,shell,Bash,Shell,我想自动修复一些视频的索引过程。下面是我的代码 for f in ~/Videos/Temp/* do f=$(echo $f | sed 's/ /\\ /g') name=$(echo $f | sed 's/Temp/Fixed/1') mencoder -forceidx "$f" -o "$name" -oac copy -ovc copy done 我遇到的问题是,mencoder声称它无法在变量$f中找到文件存储 MEncoder svn r34540 (
for f in ~/Videos/Temp/*
do
f=$(echo $f | sed 's/ /\\ /g')
name=$(echo $f | sed 's/Temp/Fixed/1')
mencoder -forceidx "$f" -o "$name" -oac copy -ovc copy
done
我遇到的问题是,mencoder声称它无法在变量$f中找到文件存储
MEncoder svn r34540 (Ubuntu), built with gcc-4.6 (C) 2000-2012 MPlayer Team
File not found: '/home/name/Videos/Temp/file\ name.avi'
Failed to open /home/bryan/Videos/Temp/file\ name.avi.
Cannot open file/device.
Exiting...
当我用扩展的变量将命令打印到终端并运行它时,它工作得很好。我甚至修改了上面的代码,打印出修复每个视频的命令,粘贴到一个新的脚本中,一切都顺利进行。我在Ubuntu上运行这个。关于是什么导致这种情况的任何想法?正如其他人所指出的,您不需要手动转义文件名中的空格。但是,也不需要使用
sed
来修改路径
find ~/Videos/Temp/ -type f -print0 | while IFS= read -r -d $'\0' f; do
name=$(echo "$f" | sed 's/Temp/Fixed/1')
mencoder -forceidx "$f" -o "$name" -oac copy -ovc copy
done
for f in ~/Videos/Temp/*
do
mencoder -forceidx "$f" -o "${f/Temp/Fixed}" -oac copy -ovc copy
done
只有第一次出现的“Temp”被替换为“Fixed”,因此您不必担心文件名中的意外替换。可能最好在脚本中也使用完整路径,以防您以后要安排它。这是真的。我通常会在脚本开头将相对路径转换为完整路径。
$f
应在第二行中引用。您不需要转义空格,因为您(正确)在变量周围使用引号。也许这就是问题的一部分?您可能还想检查您的终端是否也在使用bash作为shell。@mivk:除了变量在分配给name
时没有被引用之外。变量展开时(如您所知)应始终引用。导致变量展开的原因(如您所知)是文件名中的空格。最好的解决方案是重命名所有文件,使其不包含空格。对于文件系统维护人员来说,在路径中允许空白是一个糟糕的设计决策。在路径中使用空格是荒谬的。要求文件系统支持它们应该是一种死罪。@dennis:f=$(回显某个文件名);触摸“$f”;ls“$f”
返回一些文件名
。但是f2=$(echo$f|sed's/\\\/g');ls“$f2”
返回ls:无法访问某些\file\name:没有这样的文件或目录
。(至少使用bash 4.1.5。)