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

时间:2017-09-05 14:11:07

标签: bash output eval variable-assignment assign

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

 $(echo "pwd")

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

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

我得到以下输出:

 pwd

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

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

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

结果与之前的方法相同。我对答案herehere也有同样的问题。

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

修改:我尝试使用$()

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

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

2 个答案:

答案 0 :(得分:3)

$(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之前将$(echo "pwd")放在原始命令中一样。

如果您想在另一个变量中获取此输出,则必须再次使用$()

res=$(${var})

答案 1 :(得分:-1)

$ 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而不进行变量分配,或使用$(...)来捕获其输出。