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})
我有一个函数应该评估作为字符串传递给它的命令,并在命令失败时显示输出。但是,我遇到了一些问题:
$(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})