I have a .bashrc file, which I want to setup so it reads aliases from an .aliases file and sets them up.

Currently I have:

# User specific aliases and functions
while read alias_line
        echo `alias ${alias_line}`
done < .aliases

But upon login I get:

-bash: alias: -fu: not found -bash: alias: $USER": not found

-bash: alias: -lart": not found

The .aliases file is like this:

psu="ps -fu $USER" ll="ls -lart"


When you use alias ${alias_line}, the variable is broken up at spaces, ignoring quoting rules.

There are two ways you could fix it:

  • Remove all quoting from the alias file:

    ll=ls -lart
    psu=ps -fu $USER

    and put the variable itself in quotes:

    alias "$alias_line"

    This works because in bash, ll="ls -lart" and "ll=ls -lart" are exactly equivalent.

  • Alternatively (this is a better and more common way), have a file with alias commands, and use the . builtin (aka source) to import it.

    alias pico='nano'
    alias psu='ps x'
    alias ll='ls -lart'

    then in your ~/.bashrc:

    . ~/.aliases

The second method is better, since it does not limit you to aliases, but also allows defining functions, which are much more powerful.

  • That's right. It was a completely wrong approach. I did it myself using these commands: while read line; do echo "alias $line" >> .aliases_full; done < .aliases I then just did mv .aliases_full .aliases . ./.aliases #in .bashrc Thanks anyway :) – Vladimir Sep 4 '11 at 13:22

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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