关于输出:Bash:如何将命令传递给函数

Bash: how to pass commands to a function

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

1
 $(echo"pwd")

工作得很好(我看到文件和目录)。但是,当我想要检索这个命令的输出时:

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

我得到以下输出:

1
 pwd

为什么给输出分配一个变量会引起如此大的变化?我已经查过了,它似乎是检索输出的推荐方法(即,请参见此处)。

另外,我基于这个问题,尝试了一种不同的方法:

1
2
3
4
5
6
cmd="ls"
$cmd
file1 file2 dir1
a=$cmd
echo ${a}
ls

结果与前面的方法相同。我这里和这里的答案都有同样的问题。

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

编辑:我尝试使用$()

1
2
3
4
5
> var="pwd"
> ${var}
/c/Users/myDir
> $(${var})
bash: /c/Users/myDir: Is a directory

edit2:我需要更改当前的工作目录,所以据我所知,我不能使用$()。如何在不创建子进程的情况下获取输出?


1
$(command line)

是指执行command line,然后将其输出替换为命令行而不是该语法。如果你只是

1
$(echo"pwd")

作为整个命令行,它执行echo"pwd",得到输出pwd,并将其替换为输出,因此相当于:

1
pwd

当你这样做的时候:

1
var=$(echo"pwd")

echo"pwd"的输出是字符串pwd的输出,所以它与:

1
var="pwd"

当你这样做的时候:

1
echo ${var}

它和

1
echo"pwd"

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

1
${var}

就像你没有把echo放在$(echo"pwd")之前一样。

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

1
res=$(${var})


1
$ cmd="ls"

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

1
2
$"$cmd"
file1 file2 dir1

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

1
2
3
4
5
$ a=$("$cmd")
$ echo"$a"
file1
file2
dir1

为什么这些有效?每次你写《以东记》1(3)时,精神上都要代替《以东记》1(4)。然后你得到

1
2
$ ls
file1 file2 dir1

1
2
3
4
5
$ a=$(ls)
$ echo"$a"
file1
file2
dir1

为什么你尝试的命令失败了?因为a=$cmd相当于a=ls,与a="ls"相同。它只是将字符串ls分配给变量a。它不执行ls命令。

要调用ls,您要么编写不带变量赋值的ls,要么使用$(...)捕获其输出。