Zsh

為什麼 zsh 不擴展在函式“(:a)”中定義的這個 glob

  • March 30, 2022

腳本的第二行僅在我通過執行觸發全域擴展時才有效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修飾符可用於參數擴展,但應用方式不同,您可以嘗試:

input=${1:a}

例如:

% cd /tmp
% foo() { input=${1:a}; typeset -p input; }
% foo some-file
typeset -g input=/tmp/some-file

引用自:https://unix.stackexchange.com/questions/697349