首页 技术资料正文

alias命令_Linuxalias命令:给命令定义别名(strcmp)

piaodoo 技术资料 2022-08-26 21:53:38 998 0

alias命令_Linux alias命令:给命令定义别名(strcmp)

alias命令_Linux alias命令:给命令定义别名

在操作 Linux 的过程中,最令你感到不爽的是什么?答:命令太多,选项太多,记不住。命令可以通过本书学习,但选项太多可真的不好办了,我想即便是 Linux 大牛们,也不可能记住每个命令的所有选项吧。幸好 Linux 系统中有一个叫作 alias 的命令,它可以给一些命令设置别名,利用它我们就可以不必记住太多复杂的选项,只需将这些选项设置成别名就好啦。destory

定义别名

定义别名的方法很简单,格式如下所示:
alias [name[=value]]
这里需要注意的是:
  • 等号(=)前后不能有空格,否则就会出现语法错误了。
  • 如果value中有空格或tab,则value一定要使用引号(单、双引号都行)括起来。
了解了别名的基础知识之后,我们来看一个定义别名的例子:
[roc@roclinux ~]$ alias vi=&39;vim&39;
这个例子定义了一个 vim 命令的别名,以后,当我们执行 vi 命令时,其实真正执行的是 vim 命令。是不是很简单呢!

如何查看别名

如果太热衷于设置别名,那么你就会面临着要记住很多别名的困扰,因此,学会查看所有已设置的别名,就显得尤为重要了。查看别名的方法也很简单,直接输入 alias 命令,不加任何选项和参数即可:
[roc@roclinux ~]$ alias
alias cp=&39;cp -i&39;
alias l.=&39;ls -d .* --color=auto&39;
alias ll=&39;ls -l --color=auto&39;
alias ls=&39;ls --color=auto&39;
alias mv=&39;mv -i&39;
alias rm=&39;rm -i&39;
alias vi=&39;vim&39;
alias which=&39;alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde&39;
可以看到,系统把当前可用的所有的别名都列出来了。仔细找一下,是不是可以看到刚才设置的那个别名了:alias vi=&39;vim&39;。

查看单独命令的别名

如果我们只想查看一个单独命令是否设置了别名,那么方法有两个。方法一:使用 alias 命令加参数
[roc@roclinux ~]$ alias vi
alias vi=&39;vim&39;
方法二:使用快捷键当在终端中输入一个命令后,按下 Ctrl+Alt+E 组合键,假如设置了别名,那么别名自动会变成实际的命令。注意:这个快捷键并非在所有终端中都可行,有些终端的快捷键会和这个快捷键冲突,这样的话,该方法就不好使了。

如何取消别名

别名定义的太多了,往往带来的不是方便,而是困扰。所以我们也需要掌握删除别名的方法。那么,如何删除一个别名呢?可以使用 unalias 命令。比如,我们想删除 vi=&39;vim&39; 这个别名,可以这样来操作:
删除别名设置
[roc@roclinux ~]$ unalias vi
 
再看看, 已经被删除了吧
[roc@roclinux ~]$ alias
alias cp=&39;cp -i&39;
alias dirA=&39;echo work directory is /root&39;
alias dirB=&39;echo work directory is $PWD&39;
alias l.=&39;ls -d .* --color=auto&39;
alias ll=&39;ls -l --color=auto&39;
alias ls=&39;ls --color=auto&39;
alias mv=&39;mv -i&39;
alias rm=&39;rm -i&39;
alias which=&39;alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde&39;
经过仔细观察,确实已经找不到刚才定义的 vi 别名了。如果你想删除所有的别名,直接使用 unalias 命令的-a选项即可,只不过要谨慎使用,避免你设置的所有的别名一下子都被清除了,自己还得一个一个重新设置回来。
删除所有别名
[roc@roclinux ~]$ unalias -a
 
空空如也
[roc@roclinux ~]$ alias

如何执行命令本身而非别名

别名虽好,但也有它的弊端,比如定义的别名恰好和某个命令重名了,这就麻烦了,Shell 中执行的将永远都是别名。这里,如果我们想执行真正的那个命令而非别名,该怎么办呢?有三种方法可以解决这个问题:
  • 方案一:使用命令的绝对路径。
  • 方案二:切换到命令所在的目录,执行./command。
  • 方案三:在命令前使用反斜线(\)。
下面我们就通过示例来演示这三个方法:
绝对路径方法
[roc@roclinux ~]$ /bin/vi test.sh
 
明确指定当前路径的方法
[roc@roclinux ~]$ cd /bin
[roc@roclinux bin]$ ./vi ~/test.sh
 
使用反斜线的方法
[roc@roclinux bin]$ cd
[roc@roclinux ~]$ \vi test.sh
这里推荐大家使用最后一种方法,因为它既方便又实用。

如何让别名永久有效

我们通过 alias 命令设置的别名,仅限于在当前的 Shell 中使用,如果系统重启了,那么新设置的别名就失效了。如果想让别名永久有效的话,就需要把所有的别名设置方案加入到($HOME)目录下的 .alias 文件中(如果系统中没有这个文件,你可以创建一个),然后在 .bashrc 文件中增加这样一段代码:
Aliases
if [ -f ~/.alias ]; then
  . ~/.alias
fi
这样设置后,无论怎样重启系统,都不会影响设置的别名啦。

单引号和双引号的困惑

在别名的应用中,单引号和双引号的使用是比较容易造成困惑的,请看下面的示例:
[root@roclinux ~]$ echo $PWD
/root
[root@roclinux ~]$ alias dirA="echo work directory is $PWD"
[root@roclinux ~]$ alias dirB=&39;echo work directory is $PWD&39;
 
 正确显示
[root@roclinux ~]$ dirA            
work directory is /root
 
 正确显示
[root@roclinux ~]$ dirB
work directory is /root 
 
 显示不正确, 怎么回事?     
[root@roclinux ~]$ cd /
[root@roclinux /]$ dirA
work directory is /root     
 
 正确显示 
[root@roclinux /]$ dirB
work directory is /
上面的程序最让人困惑的是,别名中使用了 Shell 的系统变量 $PWD 来显示当前的目录路径,但当目录切换了之后,单引号的别名可以正常显示,而双引号的别名却无法正常显示了,这和我们使用 bash 的变量的经验正好相反。这是怎么回事呢?其实问题的本质在于,别名只是用来替代我们设置的命令。下面就来看看 dirA 和 dirB 背后的真实面容:
[roc@roclinux ~]$ alias dirA
alias dirA="echo work directory is /root"
 
[roc@roclinux ~]$ alias dirB
alias dirB=&39;echo work directory is $PWD&39;
看到了吧,使用双引号的 dirA,通过 Shell 的变量转换后已经变成了字符串 echo work directory is/root,当目录切换后,当然还是显示字符串的内容。而使用单引号的 dirB,由于不受 Shell 的影响,仍然保留着原来的设置 echowork directory is$PWD,当切换目录后再执行,变量 $PATH 被 Shell 替换掉,因此,内容被正确显示了。

在 Shell 脚本中执行别名的困惑

在 Shell 脚本中,alias 别名功能默认是关闭的,如果将 alias 别名编写到脚本中,而此时 Shell 内置命令和 PATH 中均没有与 alias 别名同名的命令,则 Shell 会“抱怨”找不到指定的命令。就像下面的例子中展示的一样:
[roc@roclinux ~]$ cat test.sh
!/bin/bash
ll
 
[roc@roclinux ~]$ ./test.sh
./test.sh: line 3: ll: command not found
有没有办法在 Shell 脚本中启用 alias 别名功能呢?答案是有的,那就是使用 Shell 内置的 shopt 命令来开启 alias 别名扩展选项 expand_aliases。我们现在就来试验一下:
[roc@roclinux ~]$ shopt -s expand_aliases
[roc@roclinux ~]$ shopt expand_aliases
expand_aliases on
[roc@roclinux ~]$ ./test.sh
./test.sh: line 3: ll: command not found
悲剧,怎么还是提示同样的错,难道被忽悠了?不急,我们来分析一下,找出问题的原委:
[roc@roclinux ~]$ cat test.sh
!/bin/bash
shopt expand_aliases
ll
 
[roc@roclinux ~]$ ./test.sh
expand_aliases off
./test.sh: line 5: ll: command not found
从我们的试验中可以看出,上面程序执行失败的原因是:虽然在 Shell 中 expand_aliases 是 on 状态,但当执行 test.sh 时,会产生一个新的进程去执行,这个新的进程中 expand_aliases 却是 off 的状态。知道了这个原因,我们做出相应修改,继续试验:
[roc@roclinux ~]$ cat test.sh
!/bin/bash
 
shopt expand_aliases
shopt -s expand_aliases
shopt expand_aliases
 
ll
 
[roc@roclinux ~]$ ./test.sh
expand_aliases off
expand_aliases on
./test.sh: line 8: ll: command not found
这一次我们在脚本中强制把 expand_aliases 设置为 on 状态,这次应该没有问题了吧。但事与愿违,别名在脚本中仍然不生效。作为一名合格的工程师,我们要有打破砂锅问到底的精神,控制住几近崩溃的情绪,我们继续做试验:
[roc@roclinux ~]$ cat test.sh
!/bin/bash

 
shopt expand_aliases
shopt -s expand_aliases
shopt expand_aliases
alias
 
ll
[roc@roclinux ~]$ ./test.sh
expand_aliases off
expand_aliases on
./test.sh: line 10: ll: command not found
又发现了新情况,alias 命令竟然没有输出任何内容!这还是执行程序时新生成进程的问题。从现象来看,应该是脚本中的 alias 没有继承 Shell 中 alias 的设置内容。不卖关子啦,我们揭晓最终的答案,解决方法是使用 bash 的 --login 选项:
[roc@roclinux ~]$ cat test.sh
!/bin/bash --login

 
shopt expand_aliases
shopt -s expand_aliases
shopt expand_aliases
alias
 
ll
 
[roc@roclinux ~]$ ./test.sh
expand_aliases off
expand_aliases on
alias list is
alias cp=&39;cp -i&39;
alias l.=&39;ls -d .*&39;
alias ll=&39;ls -l&39;
alias mv=&39;mv -i&39;
alias rm=&39;rm -i&39;
alias which=&39;alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde&39;
total 12
-rw-r--r-- 1 roc roc 740 Feb  5 16:21 cat.time.txt
-rwxr--r-- 1 roc roc 131 Feb  6 17:15 test1.sh
-rwxr--r-- 1 roc roc 121 Feb  6 17:45 test.sh
功夫不负有心人,这次终于执行成功了!bash 的 --login 选项的作用是使执行脚本的子 Shell 成为一个 login Shell,而 login Shell 就会读取系统和用户的 profile 及 rc 文件,这样就会顺理成章地加载到 alias 的初始设置啦。

版权声明:

本站所有资源均为站长或网友整理自互联网或站长购买自互联网,站长无法分辨资源版权出自何处,所以不承担任何版权以及其他问题带来的法律责任,如有侵权或者其他问题请联系站长删除!站长QQ754403226 谢谢。

有关影视版权:本站只供百度云网盘资源,版权均属于影片公司所有,请在下载后24小时删除,切勿用于商业用途。本站所有资源信息均从互联网搜索而来,本站不对显示的内容承担责任,如您认为本站页面信息侵犯了您的权益,请附上版权证明邮件告知【754403226@qq.com】,在收到邮件后72小时内删除。本文链接:https://www.piaodoo.com/119250.html

搜索