我使用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/*
执行带有一些选项的列表命令并显示完整路径,这对我来说很重要。
不幸的是,别名方法不允许使用通配符参数。我的目标是使这成为可能。可能这是将命令创建为函数的最佳方法。答案中提到了这一点,但它还不起作用(见评论)。
有什么想法吗?
答案 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 $@;
}