【问题标题】:Bash: how to pass commands to a functionBash:如何将命令传递给函数
【发布时间】:2018-02-13 21:02:05
【问题描述】:

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

 $(echo "pwd")

效果很好(我看到了文件和目录)。但是,当我想检索此命令的输出时:

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

我得到以下输出:

 pwd

为什么将变量分配给输出会导致如此显着的变化?我查了一下,这似乎是检索输出的推荐方式(即参见here)。

另外,我基于this 的问题并尝试了不同的方法:

cmd="ls"
$cmd
file1 file2 dir1
a=$cmd
echo ${a}
ls

结果与之前的方法相同。我对herehere 的答案有同样的问题。

我做错了什么?如何获得作为命令评估的字符串的输出?

编辑:我尝试使用$()

> var="pwd"
> ${var}
/c/Users/myDir
> $(${var})
bash: /c/Users/myDir: Is a directory

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

【问题讨论】:

  • 好吧,varpwd,因此echo ${var} 将输出pwd... 你的意思是运行$(echo ${var})
  • $()看成一个变量会更容易理解。假设变量$a 包含密码,然后只需输入$a 将运行命令,其中var=$a 会将$a 的内容(即密码,而不是命令的输出)分配给var$() 也是如此。

标签: bash output eval variable-assignment assign


【解决方案1】:
$(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})

【讨论】:

  • 感谢您的澄清-它有帮助。当我运行${var} 时,我得到了我需要的输出,但是,当我尝试分配输出时:res=${var}echo ${res},我仍然得到 pwd 命令。如何检索输出?
  • 如果要替换输出,必须使用$():res=$(${var})
  • 酒保,谢谢。但是,它对我不起作用。查看我的编辑。
  • 如果您输入$(${var})),它会执行命令,然后将输出替换为下一个命令,因此它会尝试执行输出。但是输出的是目录名,这不是你可以执行的。
  • 抱歉,没有通用的方法可以对所有命令执行此操作。您可以使用外部命令来执行此操作,因为它们总是在新进程中运行。但是您不能使用旨在更改当前进程状态的命令来执行此操作,例如cd
【解决方案2】:
$ 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 而不进行变量赋值,或者使用$(...) 来捕获其输出。

【讨论】:

    猜你喜欢
    • 2021-04-30
    • 2020-11-20
    • 2023-01-11
    • 2023-04-05
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    相关资源
    最近更新 更多