为什么此命令不能作为别名使用?

为什么此命令不能作为别名使用?

我一直在使用以下命令列出当前目录下任意深度的十个最大文件:

find -type f -size +10M -exec ls -gGsSh1 {} + | awk 'NR<=10 {print $0}'

(我用awk而不是head来防止管道破裂错误当列表太长时)

它工作得很好,但显然很难记住并每次都输入。我尝试将其放入 .bash_aliases 中,但它不起作用(它打印了 10 个空行)。

如果我使用less而不是awk,输出会正确显示,但这意味着显示大于 10MB(我的下限)的整个文件列表,按大小排序,而不仅仅是前面的文件。

那么,awk这里是什么让 choke 作为别名命令的一部分(假设这确实是问题所在),我该怎么做才能修复它?

答案1

当将此命令用作别名时,$0它不再受单引号保护,因此会转换为您的 shell 名称。这些命令演示了这一点:

$ alias F="echo '$0'"      
$ F
bash

shell 名称(可能bash)恰好未设置awk变量名,导致空行。

防止 shell 扩展的一种方法$0是使用类似以下的方法:

alias F="find -type f -size +1k -exec ls -gGsSh1 {} + | awk 'NR<=10 {print \$0}'"

然而,由于这$0没用,您可以将其从awk语句中删除。

find -type f -size +10M -exec ls -gGsSh1 {} + | awk 'NR<=10 {print}'

您可以进一步删除整个块,因为打印选定的行是awk默认行为:

find -type f -size +10M -exec ls -gGsSh1 {} + | awk 'NR<=10'

或者,您可以继续使用head并丢弃错误消息:

find -type f -size +10M -exec ls -gGsSh1 {} + 2>&1 | head

相关内容