我对直接使用命令和使用 $(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 found
是 foo
应用程序的名称。直接使用 echo 和用作myecho
别名有什么区别?
答案1
在这个命令中
myecho=$(echo)
您正在设置myecho
一个空令牌。所以下面的命令
${myecho} "${app}"
很简单"${app}"
,这显然是“foo”(不是预期的)。你会做一个别名使用不同的语法:
alias myecho="echo"
进一步阅读:
- 2.3.1 别名替换(POSIX)
- 2.6.3 命令替换(POSIX,解释
$(
使用)
答案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}"