我有一个函数应该评估作为字符串传递给它的命令,并在命令失败时显示输出。但是,我遇到了一些问题:
$(echo "pwd")
效果很好(我看到文件和目录)。但是,当我想要检索此命令的输出时:
var=$(echo "pwd")
echo ${var}
我得到以下输出:
pwd
为什么为输出分配变量会导致如此显着的变化?我查了一下它似乎是检索输出的推荐方法(即见here)。
另外,我基于this问题并尝试了不同的方法:
cmd="ls"
$cmd
file1 file2 dir1
a=$cmd
echo ${a}
ls
结果与之前的方法相同。我对答案here和here也有同样的问题。
我做错了什么?如何获取作为命令评估的字符串的输出?
修改:我尝试使用$()
:
> var="pwd"
> ${var}
/c/Users/myDir
> $(${var})
bash: /c/Users/myDir: Is a directory
Edit2:我需要更改当前的工作目录,因此,据我所知,我无法使用$()
。如何在不创建子流程的情况下获取输出?
答案 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
而不进行变量分配,或使用$(...)
来捕获其输出。