允许使用globs调用shell函数而不使用户引用

时间:2015-03-23 19:23:28

标签: bash shell

考虑以下便利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()函数以实现后一种行为而不需要引号?

2 个答案:

答案 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 /星号。此功能自动处理。我想要这个助手,因为它每天都会被使用很多次。