526

I would like to create an alias to rm command in order to have a confirmation message after executing this command. So I am creating an alias like this alias rm='rm -i'. But as far as I know this is a temporary alias and it lives until you close the terminal.

As it is explained here to save alias permanently I need to execute ~/.bash_aliases or ~/.bashrc commands in terminal and add my alias there. But when I execute ~/.bashrc I get following error message :

bash: /home/bakhtiyor/.bashrc: Permission denied

When I run ~/.bash_aliases I get another error message like this:

bash: /home/bakhtiyor/.bash_aliases: File or directory doesn't exist.

What is the actual problem and how can I solve it?

3

10 Answers 10

581

To create an alias permanently add the alias to your .bashrc file

gedit ~/.bashrc

And then add your alias at the bottom.

alt text

Now execute . ~/.bashrc in your terminal (there should be a space between the . and ~/.bashrc.

Now you can check your alias.

alt text

8
  • 6
    @karthick87 you wrote "Now execute . ~/.bashrc in your terminal (there should be a gap between the . and ~/.bashrc.". Why is this step needed?
    – Geek
    Feb 11, 2014 at 15:21
  • 5
    what does the first '.' do in . ~/.bashrc ?
    – Zen
    Jul 16, 2014 at 4:13
  • 38
    @Geek @Zen "Execute" was not the correct term. The dot is equivalent to source. With . ~/.bashrc, you source your bash. Executing the file would start a child process, execute the commands in this process, then return. All that is done in the child process has no effect on the parent process (the bash from which you executed). Instead, sourcing (with the dot) acts exactly as if you wrote the content of the file in the terminal. This is what you want. .bashrc is sourced everytime you start a bash. If you make changes, they won't apply until you start a new bash or source manually.
    – Gauthier
    Oct 3, 2014 at 9:19
  • 1
    @ButtleButkus - might want to change just one user's preferences rather than the whole system. In Ubuntu the system-wide .bashrc file is /etc/bash.bashrc
    – WillC
    Oct 26, 2016 at 3:30
  • 1
    @ShubhamA. see this question for the OSX behavior
    – jandersen
    May 7, 2018 at 18:42
332

There are a lot of ways to create an alias. The most used ways are:

  1. Add aliases directly in your ~/.bashrc file

    For example: append these line to ~/.bashrc file

    alias ll='ls -l'
    alias rm='rm -i'
    

    Next time (after you have logged out/in, or done . ~/.bashrc) when you type rm the rm -i command will be executed.

  2. The second method lets you make a separate aliases file, so you won't have to put them in .bashrc, but to a file of your choice. First, edit your ~/.bashrc file and add the following lines if they don't already exist, or uncomment them if they do:

    if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
    fi
    

    Save it and close the file. After that, all you have to do is create a ~/.bash_aliases file and add your aliases there, with the same format specified in the first method.

    Contents of my ~/.bash_aliases file:

    alias cs='cd;ls'
    
5
  • Yep, using another file for aliases is much more clean, also portable between distros. I do use that file to because some alias are not enough and a function is needed. So it's more much clean if you use a file for that task instead. I have another alias -> alias aliases="xdg-open ~/.bash_aliases && source ~/.bash_aliases", so the alias became avail at saving, and if you make some mistake it will advert you.
    – m3nda
    Apr 27, 2017 at 12:08
  • somehow after I added the alias such as alias ls='ls -althr', some of the flags given would not take effect, in this case the -t flag didn't take effect. do you know why?
    – Sajuuk
    Mar 22, 2018 at 8:43
  • 8
    By default ~/.bashrc contains inclusion for ~/.bash_aliases, no need to edit it.
    – Jaakko
    May 14, 2018 at 9:49
  • 1
    Not always ~/.bashrc contains inclusion for ~/.bash_aliases as was in my case with Ubuntu terminal Windows 10 this solution came very handy.
    – Jose
    May 30, 2018 at 18:10
  • the inclusion is for normal user and root excluded? Feb 14, 2021 at 23:41
26

It sounds to me like your only problem is trying to execute .bashrc when it is not executable. This isn't the correct way to do it; whenever you make a change to this file, you should "execute" it by the command:

source ~/.bashrc

Otherwise it will create a new shell, execute the file in the new shell's environment, and discard it when it exits - losing your change.

By sourcing the script, it executes within the current shell and will remain in effect.

The second error was because bash_aliases does not exist.

It is recommended to keep your changes separate and organized. It is only used if it exists, and you can see the test for it in .bashrc:

if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi

This says that if the file ~/.bash_aliases exists, then run it.

3
  • ~/.bash_aliases is better. askubuntu.com/questions/194111/…
    – tomByrer
    Jul 8, 2014 at 2:39
  • 1
    using the source command made my aliases work. +1
    – Daniel
    Dec 2, 2015 at 10:00
  • 5
    Just for completeness: The initial dot on the line . ~/.bash_aliases has the same meaning as the shell built-in command source. I find this to be the correct answer, explaining what’s going on.
    – Melebius
    Feb 9, 2017 at 7:46
17

The problem is that you are trying to execute a non executable file: You can check this with:

ls -la ~/.bashrc
-rw-r--r-- 1 username username 3596 2010-08-05 17:17 /home/pt001424/.bashrc

Note there is no "x - executable" letter on the first column (file permissions).

Profile files are not executable files, instead of executing them you load them with:

source /home/bakhtiyor/.bashrc

or

. /home/bakhtiyor/.bashrc
12
echo "alias vps='ssh -X [email protected]'" >> ~/.bashrc

This is an example I was looking for, a way to type a few letters at the terminal ("vps") to remotely log in to a server and enable X11 forwarding so I can run gui apps like "gedit" over the network.

Whatever the command / aliased command, this way with the echo statement, quotation marks, and the symbol for appending the output of a command to a file (>>) works for me. Just replace my command for the alias command you need and enter it into your terminal.

1
  • 1
    The quoting here is slightly tricky. In this example, using double quotes is unproblematic, but if the text within the quotes contains dollar signs, backslashes, etc, you will need to understand how the shell processes them inside double quotes. You can switch to single quotes on the outside and double quotes on the inside, but you then still need to understand how Bash processes the double quotes in the alias definition.
    – tripleee
    Nov 30, 2015 at 6:04
8

I wrote this helpful function to quickly create a new alias, and then write the alias definition to ~/.bash_aliases (if it exists) or ~/.bashrc.

TIP: Ensure ~/.bash_aliases exists & is executed in ~/.bashrc.

# -----------------------------------
#  Create a new permanent bash alias
#
#  @param $1 - name
#  @param $2 - definition
# -----------------------------------
new-alias () { 
  if [ -z "$1" ]; then
    echo "alias name:" && read NAME
  else
    NAME=$1
  fi

  if alias $NAME 2 > /dev/null > /dev/null; then
    echo "alias $NAME already exists - continue [y/n]?" && read YN
    case $YN in
      [Yy]* ) echo "okay, let's proceed.";;
      [Nn]* ) return;;
      * ) echo "invalid response." && return;;
    esac
  fi

  if [ -z "$2" ]; then
    echo "alias definition:" && read DEFINTION
  else
    DEFINTION="$2"
  fi

  if [ -f ~/.bash_aliases ]; then
    echo "alias $NAME=\"$DEFINTION\"" >> ~/.bash_aliases
  else
    echo "alias $NAME=\"$DEFINTION\"" >> ~/.bashrc
  fi

  alias $NAME="$DEFINTION"
}
4
  • 1
    Good idea, but careless using of this function may lead to trashing .bashrc with multiple instances of alias command. Your function definitely needs to implement some checkups to avoid such cluttering. Mar 31, 2016 at 1:04
  • This is a valid point. Do you have a suggested workaround you are willing to share @Troublemaker-DV? Dec 26, 2018 at 21:02
  • Unsure if it is still actual 2 1/2yo later, but... At 1st I would grep the RC for alias commands to check, if this alias was already entered there to avoid duplicates. Your check for an existence of an alias is not enough, because the RC could be already "contaminated" with multiple aliases of same name. Dec 27, 2018 at 6:51
  • Haha. You seem like a @Troublemaker-DV! I'd say that's a bit of a silly assumption and unlikely fallacy to assert. Jun 21, 2020 at 21:19
5

if you are using ruby, you can install aka using rubygem.

gem install aka2

usage

aka generate hello="echo helloworld" #add an alias
aka g hello="echo helloworld"  #add alias for lazy people

aka destroy hello #remove alias
aka d hello #remove alias for lazy people

the rubygem will auto-source your dot file so that you don't need to. Check it out.

4

I'd love to expand on this idea!

You want to alias a command according to your question:

echo "alias wolfr='cd /home/wolf'">>./~bashrc

Now you can type wolfr to move to wolf's home directory.

This is very similar and very cool, the export command:

echo "export ngse=/etc/nginx/sites-enabled"./~bashrc

Now you can type cp $ngse/my_file /destination_directory/destination_filename to copy a file from the sites-enabled directory to a destination.

None of this will work until you do something like this:

exec bash

Alternatively, you can re-log or you can reboot.

1
  • $HOME is also probably what you want, not /home. Jan 24, 2023 at 2:47
0

As I recall, bashrc has, or had, a line suggesting to not use it for aliases directly. The solution is to use an external file(s). The foo and bar aliases have been added, but to add baz the bashrc file must be "sourced" (or, just open a new terminal). Example as:

thufir@dur:~$ 
thufir@dur:~$ alias
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
alias bar='echo foo'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias foo='echo foo'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
thufir@dur:~$ 
thufir@dur:~$ cat .bash_aliases 
alias foo='echo foo'
alias bar='echo foo'
alias baz='echo baz'

thufir@dur:~$ 
thufir@dur:~$ source .bashrc 
thufir@dur:~$ 
thufir@dur:~$ alias
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
alias bar='echo foo'
alias baz='echo baz'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias foo='echo foo'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
thufir@dur:~$ 
thufir@dur:~$ baz
baz
thufir@dur:~$ 

now the baz alias works. I only just now realized that a previous answer had mentioned this technique, but they had buried the lede.

-1

I would suggest using /etc/bash.bashrc

You can add line at the end of that file.

alias ok="ping google.com"

After putting the aliases per line you have to reboot or relogin.

5
  • 7
    "I would suggest .." and why would you suggest that?
    – muru
    Aug 9, 2015 at 4:17
  • 2
    You should not be messing with the system file unless you specifically want to install a system-wide setting for all users. On a personal system, the difference is marginal, but then messing with system files is more complicated down the road, so you should probably still prefer your own personal dot files for personal preferences (and that makes it easier to copy the settings somewhere else in the future, too).
    – tripleee
    Nov 30, 2015 at 6:06
  • 2
    Reboot? That's really terrible advice, DON'T do that, especially when source /etc/bash.bashrc does all you want in this example. But should use ~/.bashrc or ~/.bash_aliases instead
    – Xen2050
    Jan 18, 2018 at 12:50
  • @Xen2050 , I suggested reboot to show it works after reboot/relogin. By the way, even another clean terminal window will also work. Jan 19, 2018 at 15:52
  • 1
    You can upgrade to a new kernel without rebooting, this ain't old windows ;-)
    – Xen2050
    Jan 19, 2018 at 15:54

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .