考虑以下便利bash函数,它不打算进入目录,而只是列出它们:
12:17:03/shared $type lld
lld is a function
lld ()
{
ls -drlta $1
}
让我们尝试使用它:
12:17:44/shared $lld pic*
-rw-r--r--@ 1 steve staff 249245 Jan 27 16:43 PIClustering.png
这是不正确的:但如果我们添加双引号,那么它会给出正确的结果:
12:17:20/shared $lld "pic*"
-rw-r--r--@ 1 steve staff 249245 Jan 27 16:43 PIClustering.png
-rw-r--r-- 1 steve staff 2004 Jan 27 18:07 pic-15.txt
drwxr-xr-x 42 steve staff 1428 Jan 30 14:30 pic
drwxr-xr-x 43 steve staff 1462 Feb 18 14:33 picsubmean
drwxr-xr-x 41 steve staff 1394 Mar 21 08:32 picschur
问题是:如何修改lld()函数以实现后一种行为而不需要引号?
答案 0 :(得分:1)
替换
ls -drlta $1
通过
ls -drlta "$@"
在调用函数或命令之前展开Glob,每个结果都成为一个单独的参数。 lld pic*
是(和无法区分)的简写:
lld "PIClustering.png" "pic" "pic-15.txt" "picsubmean" "picschur"
了解这一点,解决方案显而易见:您应该列出指定的所有文件($1
),而不是仅列出指定的第一个文件("$@"
)。
答案 1 :(得分:0)
从@ etan的评论来看,我无法准确地实现我的目标。以下是合理的传真:
12:33:10 /共享$ type lld lld是一个功能 lld() { ls -drlta $ 1 * }
然后使用它:
12:17:44/shared $lld pic
-rw-r-----@ 1 steve staff 184655 Jan 26 00:16 picInputOutputs.png
-rw-r--r-- 1 steve staff 794810294 Jan 26 01:11 pic.0126.tgz
drwxr-xr-x 43 steve staff 1462 Jan 27 16:23 picpy
-rw-r--r--@ 1 steve staff 249245 Jan 27 16:43 PIClusteringFiveCirclesInputsAndOutputs.png
-rw-r--r-- 1 steve staff 2004 Jan 27 18:07 pic-15.txt
drwxr-xr-x 48 steve staff 1632 Jan 30 12:35 pic.old
注意:没有 glob /星号。此功能自动处理。我想要这个助手,因为它每天都会被使用很多次。