Zsh

Usig zsh glob變數不在別名內擴展

  • April 20, 2022

我想按時間列出和排序,所有匹配某個模式的文件,然後只得到前 20 個:

ls -laths *.txt | head -20

這很好用,例如,如果我創建兩個文件:

touch 1.txt
touch 2.txt

上述命令的結果是:

$ ls -laths *.txt | head -20
1,5K -rw-rw---- 1 user user 0 20. Apr 09:49 2.txt
1,5K -rw-rw---- 1 user user 0 20. Apr 09:49 1.txt

如果我在終端上這樣做,這很有效。但是當試圖將其保存為別名時(輸入 $1 是我想要的模式),如下所示:

alias lis20='function _(){ ls -laths "${1}" | head -20; }; _'

然後當我使用別名時,我得到:

$ lis20 *.txt
1,5K -rw-rw---- 1 user user 0 20. Apr 09:49 1.txt

這意味著它只列出第一個文件。我已經嘗試了內部變數的幾次擴展,就像在這個問題中一樣,但沒有任何成功。

我正在使用 zsh,但如果有一個適用於 bash 和 zsh 的解決方案會很好。

別名是文本擴展,所以用lis20 *.txt別名首先擴展為

function _(){ ls -laths "${1}" | head -20; }; _ *.txt

然後文件名生成將函式呼叫變成

_ abc.txt def.txt etc.txt

所以在函式中,$1只包含第一個匹配的文件名。

現在,您可以通過在函式中使用"$@"而不是來解決這個問題"$1"……("$@"很神奇:儘管有引號,但它會擴展為多個單詞,所有參數都是分開且完整的。)

但是,無論如何,您實際上並不需要函式別名。只需使其成為單個功能:

lis20() {
   ls -laths "$@" | head -20
}

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