zsh神秘变量扩展

时间:2017-07-24 19:49:32

标签: zsh

我在prezto源代码中找到了这个:

# Set the command name, or in the case of sudo or ssh, the next command.
local cmd="${${2[(wr)^(*=*|sudo|ssh|-*)]}:t}"

我一直在阅读zsh doc,但却无法接近这一点。在shell本身的实验中,它似乎表明[]是一些算术事物,这是有道理的,但我没有看到解释(w)应该如何工作的部分。它似乎是一些适用于数学表达式的神奇算子......

slu@ubuntu-sluvm ~/.zprezto ❯❯❯ VAR="one two three four"
slu@ubuntu-sluvm ~/.zprezto ❯❯❯ echo ${VAR[2]}
n
slu@ubuntu-sluvm ~/.zprezto ❯❯❯ echo ${VAR[(w)2]}
two
slu@ubuntu-sluvm ~/.zprezto ❯❯❯ echo ${VAR[(w)]}
zsh: bad math expression: empty string
slu@ubuntu-sluvm ~/.zprezto ❯❯❯

1 个答案:

答案 0 :(得分:2)

乍一看它看起来很混乱,但是一旦你把它分解成它的部分它就很简单了。这是ZSH中参数扩展和扩展globbing支持的示例。如果您查看此代码示例的higher up in the function,则会看到它们已设置:

emulate -L zsh
setopt EXTENDED_GLOB

现在让我们分开你在那里的路线:

${
  ${
    2[ # Expand the 2nd argument
      (wr) # Match a word
      ^(*=*|=|sudo|ssh|-*) # Do not match *=*, =, sudo, ssh, or -*
    ]
  }
:t} # If it is a path, return only the filename

您可以通过创建如下示例脚本来测试:

#!/bin/zsh

emulate -L zsh
setopt EXTENDED_GLOB

echo "${$1[(wr)^(*=*|sudo|ssh|-*)]}:t}" # changed 2 to 1, otherwise identical

这是它输出的内容:

$ ./test.sh '/bin/zsh'
zsh

$ ./test.sh 'sudo test'
test

$ ./test.sh 'sudo --flag test'
test

$ ./test.sh 'ssh -o=value test'
test

$ ./test.sh 'test'
test

有关详细信息,请参阅the documentation on expansioncsh-style modifiers