Zsh
Usig zsh glob變數不在別名內擴展
我想按時間列出和排序,所有匹配某個模式的文件,然後只得到前 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 }