Bash: 如何将命令传递给函数

Bash: how to pass commands to a function

我有一个函数应该评估作为字符串传递给它的命令,并在命令失败时显示输出。但是,我遇到了一些问题:

 $(echo "pwd")

效果很好(我看到了文件和目录)。但是,当我想检索此命令的输出时:

 var=$(echo "pwd")
 echo ${var}

我得到以下输出:

 pwd

为什么将变量分配给输出会导致如此显着的变化?我查了一下,这似乎是推荐的检索输出的方法(即参见 here)。

此外,我基于 this 问题并尝试了不同的方法:

cmd="ls"
$cmd
file1 file2 dir1
a=$cmd
echo ${a}
ls

结果与之前的方法相同。我对 这里 here 的答案有同样的问题。

我做错了什么?如何获得作为命令评估的字符串的输出?

编辑: 我尝试使用 $()

> var="pwd"
> ${var}
/c/Users/myDir
> $(${var})
bash: /c/Users/myDir: Is a directory

Edit2: 我需要更改当前工作目录,因此,据我所知,我无法使用 $()。如何在不创建子流程的情况下获得输出?

$ cmd="ls"

到运行 $cmd并将其输出打印到终端,只需评估变量:

$ "$cmd"
file1 file2 dir1

要捕获 $cmd 的输出,请使用 $(...)

$ a=$("$cmd")
$ echo "$a"
file1
file2
dir1

为什么这些有效?每次写 "$cmd" 时,在心里替换 ls。然后你得到

$ ls
file1 file2 dir1

$ a=$(ls)
$ echo "$a"
file1
file2
dir1

为什么您尝试的命令会失败?因为a=$cmd等价于a=ls,与a="ls"是一样的。它只是将字符串 ls 分配给变量 a。它不执行 ls 命令。

要调用 ls,您需要编写没有变量赋值的 ls,或者使用 $(...) 来捕获其输出。

$(command line)

表示执行 command line,然后将其输出替换到命令行中以代替该语法。如果你有

$(echo "pwd")

作为整个命令行,它执行 echo "pwd",得到输出 pwd,并替换输出,所以它等同于:

pwd

当你这样做时:

var=$(echo "pwd")  

echo "pwd"的输出是字符串pwd,所以等同于:

var="pwd"

然后当你这样做时:

echo ${var}

相同
echo "pwd"

如果你想执行命令,不要在它前面放echo,只需要:

${var}

就像您在原始命令中没有在 $(echo "pwd") 之前放置 echo 一样。

如果你想在另一个变量中得到这个的输出,你必须再次使用$()

res=$(${var})