将通配符传递给别名

时间:2011-04-18 07:24:51

标签: shell unix ksh

我使用modifies list命令作为别名(在KSH中):

alias ltf='ls -lrt -d -1 $PWD/*'

所以命令ltf显示如下:

-rw-r--r-- 1 myuser mygroup 0 Apr 18 12:00 /usr/test.txt
-rw-r--r-- 1 myuser mygroup 0 Apr 18 12:00 /usr/test.log

现在我想使用通配符。但是使用ltf *.log不起作用。

实现这一目标的最佳方法是什么?


更新:我想指定我的问题,因为到目前为止答案并没有解决我的问题:命令ls -lrt -d -1 $PWD/*执行带有一些选项的列表命令并显示完整路径,这对我来说很重要。

不幸的是,别名方法不允许使用通配符参数。我的目标是使这成为可能。可能这是将命令创建为函数的最佳方法。答案中提到了这一点,但它还不起作用(见评论)。

有什么想法吗?

4 个答案:

答案 0 :(得分:5)

使用shell函数而不是别名:

function ltf {
  if [ -z "$1" ]; then
    ls -lrtd1 ${PWD}/*
  else
    ls -lrtd1 $1
  fi
}

答案 1 :(得分:2)

尝试

alias ltf='ls -lrt -d -1 $1'

或者如果你想要很多参数

alias ltf='ls -lrt -d -1 $@'

答案 2 :(得分:1)

您的问题是,当前目录中的shell扩展了通配符,而不是$ PWD。您可以通过使用shell函数而不是别名并进行一些引用来解决此问题(为方便起见,我在示例中使用$ HOME) - 将其放在.bashrc中:

ltf() {
    ls $HOME/$*
}

然后:

$ ltf '*.log'

答案 3 :(得分:0)

正如其他人所提到的,通配符扩展是在调用 shell 函数之前完成的,但使用别名则不然。

如果您不需要更改输入(OP 会这样做),这可以正常工作:

alias ltf='ls -lrt -d -1'

为了实现 OP 想要的,在 shell 函数中,您需要使用 $@ 运算符来访问通配符扩展产生的文件集,然后您需要在前面添加:

ltf() 
{ 
    #Prepend $PWD to the start of every input
    set -- "${@/#/$PWD/}"   

    #Run the command on the prepended input
    ls -lrt -d -1 $@;
}