直接使用shell命令(例如foo)和使用$(foo)有什么区别?

直接使用shell命令(例如foo)和使用$(foo)有什么区别?

我对直接使用命令和使用 $(foo) 感到困惑。我使用的是 Mac,我尝试列出由brew cask(包管理器)安装的应用程序,并回显每个应用程序。我有两个简短的 Shell 脚本,第一个如下:

#!/bin/bash
apps=$(brew cask list)
for app in ${apps}
do
    echo  "${app}"
done

它工作得很好,但是另一个喜欢这样:

#!/bin/bash
apps=$(brew cask list)
myecho=$(echo)
for app in ${apps}
do
    ${myecho}  "${app}"
done

这个返回的./script2.sh: line 7: foo: command not foundfoo应用程序的名称。直接使用 echo 和用作myecho别名有什么区别?

答案1

在这个命令中

myecho=$(echo)

您正在设置myecho一个空令牌。所以下面的命令

${myecho}  "${app}"

很简单"${app}",这显然是“foo”(不是预期的)。你会做一个别名使用不同的语法:

alias myecho="echo"

进一步阅读:

答案2

您没有设置别名。在 中myecho=$(echo)echo执行,其输出(没有任何内容,因为回显没有任何内容可回显)存储在变量 中myecho。然而,这有一些来自 echo 的输出:

$ myecho=$(echo "Hello")
$ echo "$myecho"
Hello

并且变量myecho存储了它。


我相信您在第二个脚本中想要的是echo使用变量来执行myecho。这样做是这样的:

#!/bin/bash
apps=$(brew cask list)
myecho="echo"
for app in ${apps}
do
    ${myecho}  "${app}"
done

以上所有内容与别名无关。别名是这样定义的:

alias myecho='echo'

但是,执行别名的行不应包含$

myecho "${apps}"

相关内容