Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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
在Bash中执行包含空格的命令_Bash_Shell - Fatal编程技术网

在Bash中执行包含空格的命令

在Bash中执行包含空格的命令,bash,shell,Bash,Shell,我有一个名为cmd的文件,其中包含Unix命令列表,如下所示: hostname pwd ls /tmp cat /etc/hostname ls -la ps -ef | grep java cat cmd 我还有另一个脚本,它以如下方式执行cmd中的命令: IFS=$'\n' clear for cmds in `cat cmd` do if [ $cmds ] ; then $cmds; echo "******************

我有一个名为
cmd
的文件,其中包含Unix命令列表,如下所示:

hostname
pwd
ls  /tmp
cat /etc/hostname
ls -la
ps -ef | grep java
cat cmd
我还有另一个脚本,它以如下方式执行cmd中的命令:

IFS=$'\n'
clear
for cmds in `cat cmd`
do
        if [  $cmds ] ; then
        $cmds;
        echo "****************************";
        fi
done
问题是cmd中不带空格的命令运行正常,但脚本无法正确解释带空格的命令。输出结果如下:

patrick-laptop
****************************
/home/patrick/bashFiles
****************************
./prog.sh: line 6: ls  /tmp: No such file or directory
****************************
./prog.sh: line 6: cat /etc/hostname: No such file or directory
****************************
./prog.sh: line 6: ls -la: command not found
****************************
./prog.sh: line 6: ps -ef | grep java: command not found
****************************
./prog.sh: line 6: cat cmd: command not found
****************************

我遗漏了什么?

编辑:Ben Blank的评论指出我以前的答案是错误的,谢谢

看起来您正在以单个字符串的形式执行命令,因此bash将它们视为脚本/可执行文件名

避免这种情况的一种方法是在命令上调用bash。更改:

    if [  $cmds ] ; then
    $cmds;
    echo "****************************";
    fi


编辑:结果表明,这在管道和重定向上失败。谢谢你,安多玛

您需要将
IFS
更改回循环中,以便bash知道在何处拆分参数:

IFS=$'\n'
clear
for cmds in `cat cmd`
do
    if [ $cmds ] ; then
        IFS=$' \t\n' # the default
        $cmds;
        echo "****************************";
        IFS=$'\n'
    fi
done

尝试将一行更改为
eval$cmds
,而不仅仅是
$cmds

,您可以使用命令替换脚本

sh cmd
shell的任务是读取命令并运行它们!如果需要输出/进度指示器,请在详细模式下运行shell

sh -v cmd

我个人更喜欢这种方法——如果我不必这样做的话,我不想大嚼。如果要在命令中使用管道,则确实需要使用eval。管道需要由shell而不是命令处理。我相信shell会在扩展字符串之前解析出管道

请注意,如果cmd文件包含接受输入的命令,则会出现问题。(但您始终可以为读取命令创建一个新的fd进行读取。)

清除
读取cmds时
做
如果[-n“$cmds”];然后
eval$cmds
回声“*******************************”;
fi
完成
sed“aXX”在每行后面追加XX。这不适用于多行命令,例如:

for f in * 
do 
    something $f
fi

但对于大多数情况下的单行命令,它应该可以

事实上,他的问题正好相反。在这里设置$IFS会导致
for
在换行时中断,这正是他想要的。但是,它随后试图将整个字符串解释为命令名,而不是带有参数的命令。这似乎有些过分,可能会产生令人惊讶的结果。例如,如果其中一个命令是cd命令,则后续命令将不会在另一个目录中运行。它还可以防止副作用溢出,如路径更改。因此,一个单独的过程可能正是您想要的。不过,我确实投票支持您的解决方案。proDir=${PROJECT\u DIR},其中PROJECT\u DIR在目录中包含空间。试用eval${PROJECT_DIR}无效,有人会给出建议吗?
clear
while read cmds
do
        if [ -n "$cmds" ] ; then
        eval $cmds
        echo "****************************";
        fi
done < cmd
sed 'aecho "-----------"' cmd > cmd.sh; bash cmd.sh
for f in * 
do 
    something $f
fi