Bash:如何将命令传递给函数
我有一个函数,用来计算作为字符串传递给它的命令,并在命令失败时显示输出。但是,我遇到了一些问题:Bash:如何将命令传递给函数,bash,output,eval,variable-assignment,assign,Bash,Output,Eval,Variable Assignment,Assign,我有一个函数,用来计算作为字符串传递给它的命令,并在命令失败时显示输出。但是,我遇到了一些问题: $(echo "pwd") 效果很好(我看到了文件和目录)。但是,当我要检索此命令的输出时: var=$(echo "pwd") echo ${var} 我得到以下输出: pwd 为什么将变量分配给输出会导致如此显著的变化?我已经查过了,这似乎是检索输出的推荐方法(即,请参阅) 此外,我基于这个问题,尝试了不同的方法: cmd="ls" $cmd file1 file2 dir1 a=
$(echo "pwd")
效果很好(我看到了文件和目录)。但是,当我要检索此命令的输出时:
var=$(echo "pwd")
echo ${var}
我得到以下输出:
pwd
为什么将变量分配给输出会导致如此显著的变化?我已经查过了,这似乎是检索输出的推荐方法(即,请参阅)
此外,我基于这个问题,尝试了不同的方法:
cmd="ls"
$cmd
file1 file2 dir1
a=$cmd
echo ${a}
ls
结果与前面的方法相同。我对答案和答案有同样的问题
我做错了什么?如何获得作为命令计算的字符串的输出
编辑:我尝试使用$()
:
Edit2:我需要更改当前工作目录,因此,据我所知,我无法使用$()
。如何在不创建子流程的情况下获得输出
$ cmd="ls"
要运行$cmd
并将其输出打印到终端,只需计算变量:
$ "$cmd"
file1 file2 dir1
要捕获$cmd
的输出,请使用$(…)
为什么这些能起作用?每次你写“$cmd”
,在心里替换ls
。然后你得到
$ ls
file1 file2 dir1
及
为什么您尝试的命令失败了?因为a=$cmd
相当于a=ls
,这与a=“ls”
相同。它只是将字符串ls
分配给变量a
。它不执行ls
命令
要调用ls
,您需要在不指定变量的情况下编写ls
,或者使用$(…)
捕获其输出
$(command line)
要运行$cmd
并将其输出打印到终端,只需计算变量:
$ "$cmd"
file1 file2 dir1
要捕获$cmd
的输出,请使用$(…)
为什么这些能起作用?每次你写“$cmd”
,在心里替换ls
。然后你得到
$ ls
file1 file2 dir1
及
为什么您尝试的命令失败了?因为a=$cmd
相当于a=ls
,这与a=“ls”
相同。它只是将字符串ls
分配给变量a
。它不执行ls
命令
要调用ls
,您需要在不指定变量的情况下编写ls
,或者使用$(…)
捕获其输出
$(command line)
表示执行命令行
,然后将其输出替换为命令行以代替该语法。如果你有
$(echo "pwd")
作为整个命令行,它执行echo“pwd”,获取输出pwd
,并将其替换为输出,因此它相当于:
pwd
当您这样做时:
var=$(echo "pwd")
echo ${var}
echo“pwd”
的输出是字符串pwd
,因此它与:
var="pwd"
然后,当您这样做时:
var=$(echo "pwd")
echo ${var}
这和
echo "pwd"
如果要执行该命令,不要将echo
放在它前面,只需执行以下操作:
${var}
就像您在原始命令中没有将echo
放在$(echo“pwd”)
之前一样
如果要在另一个变量中获取此变量的输出,则必须再次使用$()
:
res=$(${var})
表示执行命令行
,然后将其输出替换为命令行以代替该语法。如果你有
$(echo "pwd")
作为整个命令行,它执行echo“pwd”,获取输出pwd
,并将其替换为输出,因此它相当于:
pwd
当您这样做时:
var=$(echo "pwd")
echo ${var}
echo“pwd”
的输出是字符串pwd
,因此它与:
var="pwd"
然后,当您这样做时:
var=$(echo "pwd")
echo ${var}
这和
echo "pwd"
如果要执行该命令,不要将echo
放在它前面,只需执行以下操作:
${var}
就像您在原始命令中没有将echo
放在$(echo“pwd”)
之前一样
如果要在另一个变量中获取此变量的输出,则必须再次使用$()
:
res=$(${var})
嗯,
var
是pwd
,因此echo${var}
将输出pwd
。。。您是否打算运行$(echo${var})
?将$()
视为一个变量,这样会更容易理解。假设一个变量$a
包含pwd,然后只需键入$a
即可运行命令,其中var=$a
将$a
的内容(即pwd,而不是命令的输出)分配给var
。这同样适用于$()
。嗯,var
是pwd
,因此echo${var}
将输出pwd
。。。您是否打算运行$(echo${var})
?将$()
视为一个变量,这样会更容易理解。假设一个变量$a
包含pwd,然后只需键入$a
即可运行命令,其中var=$a
将$a
的内容(即pwd,而不是命令的输出)分配给var
。这同样适用于$()
。感谢您的澄清。当我运行${var}
时,我得到了我需要的输出,但是,当我尝试分配输出时:res=${var}
,echo${res}
,我仍然得到了pwd命令。如何检索输出?如果要替换输出,必须使用$()
:res=$(${var})
Barman,谢谢。然而,这对我不起作用。请参阅我的编辑。如果键入$(${var}))
它将执行命令,然后将输出替换为下一个命令,因此它将尝试执行输出。但是输出是目录名,这不是您可以执行的。很抱歉,没有通用的方法可以对所有命令执行此操作。您可以使用外部命令来执行此操作,因为它们始终在新进程中运行。但是您不能使用旨在更改当前进程状态的命令,如cd
。感谢您的澄清