Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

I am trying to create an aliases in bash. What I want to do is map ls -la to ls -la | more

In my .bashrc file this is what I attempted:

alias 'ls -la'='ls -la | more'

However it does not work because (I assume) it has spaces in the alias name. Is there a work around for this?

share|improve this question
4  
Why not do alias lsm='ls -la | more' –  Nifle Feb 5 '10 at 22:52

4 Answers 4

up vote 28 down vote accepted
ls() { if [[ $@ == "-la" ]]; then command ls -la | more; else command ls "$@"; fi; }
share|improve this answer
5  
and while this works, it is not an alias, but a function. –  quack quixote Feb 6 '10 at 17:33
    
Thanks for the clarification. –  Dennis Williamson Feb 6 '10 at 19:36
    
why do you need to use double brackets inside the if statement? –  sixtyfootersdude Feb 8 '10 at 14:55
    
@sixtyfootersdude: The double-bracket form is more powerful and I use it by habit. See mywiki.wooledge.org/BashFAQ/031 –  Dennis Williamson Feb 8 '10 at 18:35

From the alias man page:

The first word of each simple command, if unquoted, is checked to see if it has an alias. If so, that word is replaced by the text of the alias. The alias name and the replacement text may contain any valid shell input, including shell metacharacters, with the exception that the alias name may not contain `='.

So, only the first word is checked for alias matches which makes multi-word aliases impossible. You may be able to write a shell script which checks the arguments and calls your command if they match and otherwise just calls the normal ls (See @Dennis Williamson's answer)

share|improve this answer
    
+1 For explaining why I am not allowed to use ls -la as an alias. –  sixtyfootersdude Feb 8 '10 at 14:49
1  
This was helpful because instead of trying to solve it it answered the question. I came here because i wanted to create an alias with a space in it and that just won't happen. –  angryundead Feb 11 at 21:15

A slightly improved approach taken from Dennis' answer:

function ls() {
  case $* in
    -la* ) shift 1; command ls -la "$@" | more ;;
    * ) command ls "$@" ;;
  esac
}

Or the one-liner:

function ls() { case $* in -la* ) shift 1; command ls -la "$@" | more ;; * ) command ls "$@" ;; esac }

This allows for further options/arguments to be appended after the command if needed, for example ls -la -h

share|improve this answer
    
How does this handle if I want ls -lat to be excluded from this treatment? I would need to put a case to handle it above the -la* entry, yes? –  Steven Lu Apr 28 at 5:36

You can invoke this alias still, but you need quotation in order that the space is part of the command word. So "ls -la" -p pattern will pass the -p pattern option to more, not ls.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.