我在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 ❯❯❯
答案 0 :(得分:2)
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 expansion和csh-style modifiers。