我想为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.


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

评论

答案-stackoverflow.com/a/2622711/1487102

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

#1 楼

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

gedit ~/.bashrc


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



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

现在您可以检查别名。



评论


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

–极客
2014年2月11日15:21

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

–禅
2014年7月16日下午4:13

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

–Gauthier
2014年10月3日,9:19



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

– WillC
16-10-26在3:30



@ShubhamA。查看此问题以了解OSX行为

–詹德森
18年5月7日在18:42

#2 楼

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



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

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

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


下次(注销/登录或完成. ~/.bashrc)时,键入rm时,将执行rm -i命令。


第二种方法可让您制作一个单独的别名文件,因此您不必将它们放在.bashrc中,而是放入您选择的文件中。首先,编辑您的~/.bashrc文件并添加以下行(如果尚不存在),或者添加以下注释:

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


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

我的~/.bash_aliases文件的内容:

alias cs='cd;ls'




评论


+1用于使用〜/ .bash_aliases。

–ændrük
2011年6月10日下午5:48

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

– m3nda
17年4月27日在12:08

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

– Sajuuk
18-3-22在8:43



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

– Jaakko
18年5月14日在9:49

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

–乔斯
18年5月30日在18:10

#3 楼

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

source ~/.bashrc


否则,它将简单地创建一个新的shell,在该文件中执行新外壳程序的环境,然后在退出时丢弃该环境,从而丢失您的更改。通过提供脚本,脚本将在当前shell中执行,因此它将保持有效。

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

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


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

评论


〜/ .bash_aliases更好。 askubuntu.com/questions/194111/…

–tomByrer
2014年7月8日在2:39

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

– dspacejs
2015年12月2日,10:00

仅出于完整性考虑:在线上的初始点。 〜/ .bash_aliases具有与Shell内置命令源相同的含义。我认为这是正确的答案,解释了发生了什么。

–梅勒比乌斯
17-2-9在7:46



#4 楼

问题是您正在尝试执行一个非可执行文件:
您可以使用以下命令进行检查:

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


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

配置文件不是可执行文件,而不是执行它们,而是使用以下命令加载它们:

source /home/bakhtiyor/.bashrc


or

. /home/bakhtiyor/.bashrc


#5 楼

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


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

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

评论


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

–tripleee
2015年11月30日下午6:04

#6 楼

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

提示:确保~/.bash_aliases存在并在~/.bashrc中执行。

# -----------------------------------
#  Create a new permanent bash alias
#
#  @param  - name
#  @param  - definition
# -----------------------------------
new-alias () { 
  if [ -z "" ]; then
    echo "alias name:" && read NAME
  else
    NAME=
  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 "" ]; then
    echo "alias definition:" && read DEFINTION
  else
    DEFINTION=""
  fi

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

  alias $NAME="$DEFINTION"
}


评论


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

–Troublemaker-DV
16-3-31的1:04

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

–blizzrdof77
18/12/26在21:02



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

–Troublemaker-DV
18/12/27在6:51

哈哈。您似乎像@ Troublemaker-DV!我会说这是一个愚蠢的假设,不太可能断言。

–blizzrdof77
6月21日21:19

#7 楼

如果您使用的是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


ruby​​gem将自动获取您的点文件,这样您就不会需要。看看这个。

#8 楼

我想扩展这个想法!

您想根据自己的问题为命令添加别名:

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

现在您可以键入wolfr移至wolf的主目录。

这非常相似,也很酷,导出命令:

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

现在您可以键入cp $ngse/my_file /destination_directory/destination_filename将文件从启用站点的目录复制到目标位置。

在执行以下操作之前,这些操作均无效:

exec bash

或者,您可以重新登录或重新启动。

#9 楼

我建议使用/etc/bash.bashrc

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

alias ok="ping google.com"


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

评论


“我会建议..”,您为什么会建议呢?

–muru
2015年8月9日在4:17



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

–tripleee
15年11月30日在6:06

重启?这确实是一个可怕的建议,不要这样做,尤其是在本示例中/etc/bash.bashrc源满足您的所有要求时。但是应该使用〜/ .bashrc或〜/ .bash_aliases代替

– Xen2050
18年1月18日在12:50

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

–法哈德·阿罕默德(Fahad Ahammed)
18年1月19日在15:52

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

– Xen2050
18年1月19日在15:54

#10 楼

我记得,bashrc曾经或曾经有行建议不要直接将其用于别名。解决方案是使用外部文件。已经添加了foobar别名,但是要添加baz,必须“来源” 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 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别名有效。我才刚刚意识到以前的回答已经提到了这种技术,但是他们掩埋了壁垒。

#11 楼

我已经使用python为同一事物创建了一个自定义命令行工具
在此处查看代码