脚本的第二行仅在我通过执行触发全局扩展时才有效echo
。我不明白为什么。这是命令,它的执行是为了提供一些上下文。
函数定义:
~/ cat ~/.zsh/includes/ascii2gif
ascii2gif () {
setopt extendedglob
input=$(echo ${1}(:a))
_path=${input:h}
input_f=${input:t}
output_f=${${input_f}:r}.gif
cd $_path
nerdctl run --rm -v $_path:/data asciinema/asciicast2gif -s 2 -t solarized-dark $input_f $output_f
}
激活 ascii2gif 函数的函数调试..
~/ typeset -f -t ascii2gif
调试功能执行:
~/ ascii2gif ./demo.cast
+ascii2gif:1> input=+ascii2gif:1> echo /Users/b/demo.cast
+ascii2gif:1> input=/Users/b/demo.cast
+ascii2gif:2> _path=/Users/b
+ascii2gif:3> input_f=demo.cast
+ascii2gif:4> output_f=demo.gif
+ascii2gif:5> cd /Users/b
+_direnv_hook:1> trap -- '' SIGINT
+_direnv_hook:2> /Users/b/homebrew/bin//direnv export zsh
+_direnv_hook:2> eval ''
+_direnv_hook:3> trap - SIGINT
+ascii2gif:6> nerdctl run --rm -v /Users/b:/data asciinema/asciicast2gif -s 2 -t solarized-dark demo.cast demo.gif
==> Loading demo.cast...
==> Spawning PhantomJS renderer...
==> Generating frame screenshots...
==> Combining 40 screenshots into GIF file...
==> Done.
我尝试了许多变体来尝试强制扩展input=${~1}(:a)
等,但无济于事。有什么建议么?显然脚本有效,但似乎次优。
那是因为您在这里尝试使用修饰符的方式是
a
用于通配符,并且不会发生通配符(因为通配符通常会导致多个单词,因此不会在需要单个单词的上下文中发生)。因此,您依赖于在命令替换中发生的通配,然后将结果分配给变量。var=WORD
由于
a
修饰符可用于参数扩展,但应用方式不同,您可以尝试:例如:
/u muru的答案看起来是解决这个问题的正确方法,但它不扩展的原因是文件名生成(通配符)不会发生在标量分配中(它发生在数组分配中,因为 glob - 通常 -可能返回多个匹配项):
来自
man zshoptions
:所以
但