我目前正在研究 dotfiles 配置(运行 zsh),我一直在我的迷你家庭服务器和 PC 上的 Linux CLI 上使用它。我还在运行 MacOS 的工作 Macbook 上使用了它,但注意到我遇到了一些奇怪的问题。
(($+commands[terraform])) && {
alias tf="terraform"
}
上面的代码是我的 zsh 别名文件的一部分,它将“tf”映射到 terraform 命令。我一直遇到的问题是,这在 Mac 终端上不起作用;其中我收到“'tf'命令未找到错误”(或沿线),但在 VS Code 集成终端中却出现了错误。进一步增加混乱的是,我将“g”映射到 git,并且它在 Mac 终端和 VS Code 集成终端上都能完美运行。
任何想法或帮助都会很棒。谢谢
$+commands[terraform]
如果将命令名称映射到其路径的特殊关联数组中1
存在带有 key 的元素,则扩展为0,否则扩展为 0。terraform
$commands
((arithmetic expression))
如果算术表达式解析为(or ),则返回false ,否则返回true,因此当且仅当是 shell 的已知(外部、非内置、别名、函数...)命令时返回true 。0
0.
(($+commands[terraform]))
terraform
特殊的关联数组公开了内部命令哈希表,与默认情况下内置命令操作的
$commands
哈希表相同,并且当 shell 在数组目录中查找命令时自动填充该哈希表(与冒号分隔的标准环境变量相关))。hash
rehash
unhash
$path
$PATH
该特殊关联数组随
zsh/parameter
动态可加载模块一起提供,但在当前版本的 中zsh
,当取消引用变量时会自动加载该模块。当 zsh 模拟其他 shell 时,情况并非如此,例如当它被称为
sh
、ksh
、csh
或 with时--emulate sh/ksh/csh
,但我希望您在解释 zsh 特定代码时会在这些模拟模式中遇到一些错误。即使内部命令哈希表尚未填充,在第一次引用 时
$commands
,也会填充它。$path
当/$PATH
被修改时它也会重新生成。因此,如果您的
tf
别名未定义,则表明在运行时,当时(($+commands[terraform]))
的值中没有目录包含名为. 您可以在该行之前添加一个以查看此时它的值。$path
terraform
typeset -p path
在任何情况下,别名只是在命令位置找到时替换为其他文本的一些文本,因此该
terraform
命令不必存在(作为命令或其他方式,例如内置命令、函数...),您就可以定义它,所以你也可以无条件地定义它:您还可以将其设为函数而不是别名:
无论哪种情况,如果稍后运行该
terraform
命令时不存在,您将收到一条错误消息,指出该命令不存在。tf
terraform
顺便说一句,我宁愿写你的代码:
使用
condition && action
是正确构造的糟糕替代品if
。在具有缩写形式的 zsh 中if
,它甚至更短。这意味着如果 为condition
假,则整体condition && action
为假,其素数$?
为非零值。