如何创建永久的Bash别名?


381

我想为rm命令创建别名,以便在执行此命令后收到确认消息。所以我正在创建一个这样的别名alias rm='rm -i'。但是据我所知,这是一个临时别名,它会一直存在,直到您关闭终端为止。

正如这里解释的那样要永久保存别名,我需要在终端中执行~/.bash_aliases~/.bashrc命令,然后在其中添加别名。但是当我执行时,出现~/.bashrc以下错误消息:

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

当我运行时,~/.bash_aliases我收到另一个错误消息,如下所示:

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

实际问题是什么,我该如何解决?



alias rm='rm -i'不能解决随意使用rm的问题
qwr

Answers:


428

要创建别名,请将别名永久添加到.bashrc文件中

gedit ~/.bashrc

然后在底部添加您的别名。

替代文字

现在. ~/.bashrc在您的终端中执行(.和之间应该有一个空格~/.bashrc

现在,您可以检查别名。

替代文字


5
@ karthick87,您写了“现在在终端中执行。〜/ .bashrc(。和〜/ .bashrc之间应该有一个间隙。”。为什么需要此步骤?
Geek 2014年

5
第一个'是什么。做。〜/ .bashrc吗?
2014年

22
@Geek @Zen“执行”不是正确的术语。点等于source。使用. ~/.bashrc,您可以获取bash。执行该文件将启动一个子进程,在该进程中执行命令,然后返回。在子进程中完成的所有操作均对父进程(执行执行的bash)没有影响。取而代之的是,源(带有点)的行为就像您在终端中写入文件的内容一样。这就是你想要的。.bashrc每次您启动bash时都会来源。如果您进行更改,则在您手动启动新的bash或源之前,它们将不适用。
Gauthier 2014年

@ButtleButkus-可能只想更改一个用户的首选项,而不是整个系统。在Ubuntu中,系统范围的.bashrc文件是/etc/bash.bashrc
WillC

1
@ShubhamA。看到这个问题的OSX的行为
jandersen

253

有很多创建别名的方法。最常用的方法是:

  1. 直接在~/.bashrc文件中添加别名

    例如:将这些行附加到~/.bashrc文件

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

    下次(退出/登录或完成后. ~/.bashrc)键入命令时,将执行rmrm -i命令。

  2. 第二种方法使您可以创建单独的别名文件,因此不必将它们放在中.bashrc,而是放置到您选择的文件中。首先,编辑~/.bashrc文件并添加以下行(如果尚不存在),或者取消注释(如果存在):

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

    保存并关闭文件。之后,您要做的就是创建一个~/.bash_aliases文件,并在其中添加别名,其别名与第一种方法中指定的格式相同。

    ~/.bash_aliases文件的内容:

    alias cs='cd;ls'

71
+1以使用~/.bash_aliases
ændrük

是的,使用另一个文件作为别名更干净,也可以在发行版之间移植。我之所以使用该文件,是因为某些别名是不够的,并且需要一个函数。因此,如果您为该任务使用文件,则更为干净。我还有另一个别名-> alias aliases="xdg-open ~/.bash_aliases && source ~/.bash_aliases",因此别名在保存时变得可用,如果您犯了一些错误,它将给您带来广告。
erm3nda

在添加别名(如)后alias ls='ls -althr',以某种方式,某些给定的标志将不会生效,在这种情况下,-t标志不会生效。你知道为什么吗?
Sajuuk

3
默认情况下~/.bashrc包含的内容~/.bash_aliases,无需对其进行编辑。
Jaakko

1
并非总是〜/ .bashrc包含〜/ .bash_aliases的内容,就我在Ubuntu终端Windows 10中而言,此解决方案非常方便。
何塞

19

在我看来,您唯一的问题就是在无法执行时尝试执行.bashrc。但这不是正确的方法。每当您对此文件进行更改时,都应通过以下命令“执行”该文件:

source ~/.bashrc

否则,它将仅创建一个新的shell,在新shell的环境中执行文件,然后在退出该环境时丢弃该环境,从而丢失您的更改。通过采购脚本,它可以在当前shell中执行,因此它将保持有效。

我假设第二个错误是因为bash_aliases不存在。不需要这样做,只是建议您将更改分开并组织起来。仅当它存在时才使用它,并且您可以在.bashrc中查看它的测试:

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

这表示如果文件〜/ .bash_aliases存在,请运行它。



1
使用source命令使我的别名正常工作。+1
dspacejs 2015年

4
仅出于完整性考虑:行上的初始点. ~/.bash_aliases与shell内置命令的含义相同source。我发现这是正确的答案,解释了发生了什么。
Melebius

17

问题是您正在尝试执行不可执行的文件:您可以使用以下方法进行检查:

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

请注意,第一列上没有“ x-可执行文件”字母(文件权限)。

概要文件不是可执行文件,而是通过以下方式加载而不是执行它们:

source /home/bakhtiyor/.bashrc

要么

. /home/bakhtiyor/.bashrc

7
echo "alias vps='ssh -X user@example.com'" >> ~/.bashrc

这是我一直在寻找的示例,一种在终端(vps)上键入几个字母以远程登录服务器并启用X11转发的方法,这样我就可以在网络上运行诸如“ gedit”之类的gui应用程序。

无论使用什么命令/别名命令,通过echo语句,引号和用于将命令输出附加到文件(>>)的符号的这种方式都对我有效。只需将我的命令替换为所需的别名命令,然后将其输入到终端即可。


这里的报价有点棘手。在此示例中,使用双引号是没有问题的,但是如果双引号中的文本包含美元符号,反斜杠等,则需要了解shell如何在双引号内处理它们。您可以在外部将单引号切换为内部并将双引号切换为内部,但是您仍然需要了解Bash如何处理别名定义中的双引号。
2015年

5

如果您使用的是ruby,则可以使用rubygem来安装。

gem install aka2

用法

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

rubygem将自动获取您的点文件,因此您不需要这样做。看看这个。


4

我编写了此有用的函数以快速创建新的别名,然后将别名定义写入~/.bash_aliases (如果存在)~/.bashrc

提示:确保~/.bash_aliases存在并在中执行~/.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"
}

1
好主意,但粗心使用此功能可能会导致.bashrc多个alias命令实例的破坏。您的功能肯定需要实施一些检查,以免造成混乱。
Troublemaker-DV

这是有道理的。您是否有建议的解决方法,愿意分享@ Troublemaker-DV?
blizzrdof77

不确定以后2 1 / 2yo是否仍然是实际的,但是...在1st时,我会grep RC来检查别名命令,是否已经在此输入别名以避免重复。您对别名是否存在的检查还不够,因为RC可能已经被多个同名别名“污染”了。
Troublemaker-DV

0

我建议使用 /etc/bash.bashrc

您可以在该文件的末尾添加行。

alias ok="ping google.com"

每行输入别名后,您必须重新启动或重新登录。


7
“我会建议..”,您为什么会建议呢?
muru 2015年

2
除非您特别想为所有用户安装系统范围的设置,否则不要弄乱系统文件。在个人系统上,差异很小,但是在以后处理系统文件时比较麻烦,因此您可能仍应根据自己的喜好选择自己的个人点文件(这样可以更轻松地将设置复制到其他地方)未来也是如此)。
2015年

1
重启?那真的是个可怕的建议,不要这样做,尤其是source /etc/bash.bashrc在本示例中什么时候想要。但应该使用~/.bashrc~/.bash_aliases代替
Xen2050

@ Xen2050,我建议重新启动以显示重新启动/重新登录后可以正常工作。顺便说一句,即使另一个干净的终端窗口也将起作用。
Fahad Ahammed

1
您可以在不重启的情况下升级到新内核,这不是旧的Windows ;-)
Xen2050

0

我记得,bashrc曾经或曾经有行建议不要直接将其用于别名。该溶液是使用外部文件(多个)。在foobar别名已添加,但添加bazbashrc文件必须是“源”(或者,只需打开一个新的终端)。示例如下:

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:~$ 

现在baz别名起作用了。我才刚刚意识到以前的回答已经提到了这种技术,但是他们已经埋葬了书架。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.