Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash:如何将命令传递给函数_Bash_Output_Eval_Variable Assignment_Assign - Fatal编程技术网

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
。感谢您的澄清