使用 zsh glob 变量未在别名内扩展

使用 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 的解决方案就好了。

答案1

别名是文本扩展,因此lis20 *.txt别名首先扩展为

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

然后文件名生成将函数调用变成

_ abc.txt def.txt etc.txt

so 在函数中,$1仅包含第一个匹配的文件名。

现在,您可以通过在函数中使用而不是来解决这个问题...("$@"很神奇:尽管有引号,它还是扩展为多个单词,所有参数都是单独且完整的。)"$1""$@"

但是,你真的不需要一个函数无论如何,一个别名。只需将其设为单个函数即可:

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

相关内容