Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.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
在bashshell脚本中使用反引号执行命令_Bash_Shell - Fatal编程技术网

在bashshell脚本中使用反引号执行命令

在bashshell脚本中使用反引号执行命令,bash,shell,Bash,Shell,我用bash编写了一个小shell脚本,它允许我在子目录中执行命令。这是剧本 bat.sh: #!/bin/sh for d in */; do echo "Executing \"$@\" in $d" cd $d `$@` cd .. done 使用以下目录结构 /home/user --a/ ----x.txt ----y.txt --b/ ----u.txt ----v.txt 我希望下面的命令在主目录中执行时列出目录a和b的内容 bat.sh ls 结果是 Exe

我用bash编写了一个小shell脚本,它允许我在子目录中执行命令。这是剧本

bat.sh:

#!/bin/sh

for d in */; do
  echo "Executing \"$@\" in $d"
  cd $d
  `$@`
  cd ..
done
使用以下目录结构

/home/user
--a/
----x.txt
----y.txt
--b/
----u.txt
----v.txt
我希望下面的命令在主目录中执行时列出目录a和b的内容 bat.sh ls

结果是

Executing "ls" in a/
/home/user/bin/bat.sh: line 6: x.txt: command not found
Executing "ls" in b/
/home/user/bin/bat.sh: line 6: u.txt: command not found

你知道这里出了什么问题吗?

你不需要反引号;你需要双引号

#!/bin/sh

for d in */
do
    echo "Executing \"$*\" in $d"
    (cd "$d" && "$@")
done
您正试图执行传递的命令的输出,而您只是想执行该命令


使用显式子shell(
(…)
符号)可以避免跳转到其他目录的符号链接出现一些问题。在我看来(可能是过时的),为了执行命令,切换目录是一种更安全的方法。

您不需要反引号;你需要双引号

#!/bin/sh

for d in */
do
    echo "Executing \"$*\" in $d"
    (cd "$d" && "$@")
done
您正试图执行传递的命令的输出,而您只是想执行该命令


使用显式子shell(
(…)
符号)可以避免跳转到其他目录的符号链接出现一些问题。在我看来(可能是过时的),为了执行命令,这是一种更安全的切换目录的方法。

Txt文件不是可执行文件。。。您希望执行
x.txt
的结果是什么?请删除那些反勾号,并引用
$@
“$@”
。txt文件不是可执行文件。。。您希望执行
x.txt
的结果是什么?去掉那些反勾号,并引用
$@
“$@”
。在这种情况下,缺少引号是非常重要的——名称中带有空格的目录是经常发生的事情。@CharlesDuffy:是的;这一次你是对的(但我是从主要有效的问题中复制代码的)。这也是一个在双引号中合法使用
$*
的机会,但这可能有点微妙。(将
cd“$d”和&“$@”设置为
cd
,以确保
cd
中的故障不会导致在当前目录中运行wrapped命令;更喜欢优雅的故障模式,&c)也是一个很好的做法.既然我们已经谈到了主题,请检查以下答案:“执行命令输出”部分。我已经对这个答案发表了评论;但是没有得到任何令人满意的答案……在这种情况下,缺少引号真的很关键——名称中带有空格的目录是经常发生的事情。@CharlesDuffy:是的;这一次你是对的(但我是从主要有效的问题中复制代码的)。这也是一个在双引号中合法使用
$*
的机会,但这可能有点微妙。(将
cd“$d”和&“$@”设置为
cd
,以确保
cd
中的故障不会导致在当前目录中运行wrapped命令;更喜欢优雅的故障模式,&c)也是一个很好的做法.既然我们已经谈到了主题,请检查以下答案:“执行命令输出”部分。我已经对这个答案发表了评论;但没有得到任何令人满意的答复。。。