Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
命令在Linux终端中运行,但不在bash脚本中运行_Bash_Shell - Fatal编程技术网

命令在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。)