Pass wildcard to alias
I use a modifies list command as alias (in KSH):
alias ltf='ls -lrt -d -1 $PWD/*'
So the command ltf
displays something like this:
-rw-r--r-- 1 myuser mygroup 0 Apr 18 12:00 /us开发者_JS百科r/test.txt
-rw-r--r-- 1 myuser mygroup 0 Apr 18 12:00 /usr/test.log
Now I want to use wildcards. But using ltf *.log
does not work.
What is the best way to achieve that?
Update: I want to specify my question because the answers does not solve my problem so far: the command ls -lrt -d -1 $PWD/*
executes a list command with some options AND it displays the full path, which is an important point for me.
Unfortunately the alias approach does not allow wildcard parameters. My goal is to make this possible. Probably it is the best way to create the command as a function. This is mentioned in the answers, but it does not work yet (see comments).
Any ideas?
Use a shell function instead of an alias:
function ltf {
if [ -z "$1" ]; then
ls -lrtd1 ${PWD}/*
else
ls -lrtd1 $1
fi
}
Your problem is that the wildcards are getting expanded by the shell in your current directory, not in $PWD. You can solve this by using a shell function rather than an alias and doing some quoting (I use $HOME in the example for my convenience) - put this in .bashrc:
ltf() {
ls $HOME/$*
}
and then:
$ ltf '*.log'
try
alias ltf='ls -lrt -d -1 $1'
or if you want many params
alias ltf='ls -lrt -d -1 $@'
As mentioned by others, wildcard expansion is done before calling shell functions, but not so with an alias.
If you don't need to change the input (which the OP does), this would work fine:
alias ltf='ls -lrt -d -1'
To achieve what the OP wants, within a shell function you would need to use the $@
operator to access the set of files resulting from the wildcard expansion, which you would then need to prepend:
ltf()
{
#Prepend $PWD to the start of every input
set -- "${@/#/$PWD/}"
#Run the command on the prepended input
ls -lrt -d -1 $@;
}
精彩评论