Use argument in bash command in first part of a pipe

I want to have a simple function or alias in my bashrc that lists files with ls using all my favorite options and pipes the output to more.
Here is how it looks like

l() {
    ls -lh --color $1 | more 

However, when I call this function in a terminal with a wildcard argument, like l *.txt, the blob is resolved before it gets passed to my function. The result is, that I only get the first txt file displayed.

I am afraid that using a function is an overkill for what I want. Is there a way to do this without a function, with just a simple alias?

>Solution :

*.txt is not the argument; it’s a pattern that could expand (depending on your shell settings) to 0 or more separate arguments. Your function only looks at the first of them.

Use "$@" instead of "$1 to pass all arguments to ls.

l () {
    ls -lh --color "$@" | more

The alias would suffice if you weren’t trying to pipe the output to more, as aliases don’t take arguments.

alias l='ls -lh --color'

Leave a Reply