Linux shell编程学习笔记31:alias 和 unalias 操作 命令别名

目录

  1. 0 前言
  2. 1 定义别名
  3. 2 查看别名
    1. 2.1 查看所有别名
    2. 2.2 查看某个别名
      1. 2.2.1  alias 别名
      2. 2.2.2 alias | grep 别名字符串
      3. 2.2.3 使用 Ctrl+Alt+E 组合键
  4. 3 unalias:删除别名
  5. 4 如何执行命令本身而非别名
    1. 4.1 方法1:使用 Ctrl+Alt+E 组合键  && unalias
    2. 4.2 方法2:在命令前加上命令文件的绝对路径
    3. 4.3 方法3:在命令前加上相对路径
    4. 4.4 方法4:在命令前加上反斜线\
  6. 5 如何让别名永久有效
  7. 6 为何推荐使用单引号
  8. 7 参考资料

0 前言

记得在DOS中有个doskey命令,使用doskey命令可以定义宏,宏的的执行优先级是最高的,比DOS的内置命令还高(DOS中的命令执行优先级从高至低依次是:宏命令、DOS内部命令,以com为扩展名的可执行程序,以exe位扩展名的可执行程序、以bat位扩展名的批处理程序)。

这就意味着,如果你定义的宏与dos的内置命令同名,比如dir,当你在命令行输入dir时,系统会优先执行你宏,而不是dos的内置命令,这为我们提供了修改内部命令功能的途径。

那以Linux中是否提供有相似的功能呢?

1 定义别名

在Linux中,我们使用alias命令来定义命令别名。格式如下:

alias [命令别名[=值]]

与定义变量相似,在定义命令别名时,要注意:

  • 等号(=)前后不能有空格,否则就会出现变成比较,引起语法错误
  • 如果值中有空格或tab,则值一定要使用单引号、双引号括起来(推荐单引号)

2 查看别名

2.1 查看所有别名

要查看所有别名,直接输入 alias 命令,不加任何选项和参数即可:

purpleEndurer @ bash $alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
purpleEndurer @ bash $

当前定义有6个命令别名 

2.2 查看某个别名

要查看某个别名,有几种方法。

2.2.1  alias 别名

例2.2.1.1 要查看名为abc的别名,就用命令:alias abc

purpleEndurer @ bash $alias abc
bash: alias: abc: not found

 

由于系统中不存在名为abc的别名,所以系统反馈 not found

例2.2.1.2 要查看名为ls的别名,就用命令:alias ls

purpleEndurer @ bash $alias ls
alias ls='ls --color=auto'

可见我们在命令行使用的ls命令,其实是带有 参数的ls命令。

这就意味着,有些命令的选项,我们经常使用,但又不是命令默认选项,那么我们就可以通过定义别名来实现,这样就不需要每次都输入那些选项了。

  • 注意:alias查看别名不支持通配符

例如,要查找所有l开头的别名:

purpleEndurer @ bash $alias l*
bash: alias: l*: not found

2.2.2 alias | grep 别名字符串

例如,我们要查找所有包含ls的别名:

purpleEndurer @ bash $alias | grep ls*
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
purpleEndurer @ bash $

由于grep支持正则表达式,因此我们还可以使用正则表达式来获取符合条件的命令别名。

例2.2.2.1 获取以ls开头,后面可以接字母、数字、下划线或者汉字的命令别名:

purpleEndurer @ bash $ alias | grep "\bls\w*="
alias ls='ls --color=auto'

命令中的字符串"\bls\w*="为正则表达式,其中:

  1. \b 匹配单词的开始或结束
  2. \w 字母、数字、下划线或者汉字

这样只找到一个匹配的命令别名。

例2.2.2.2 获取以l开头,后面可以接字母、数字、下划线或者汉字的命令别名:

purpleEndurer @ bash $ alias | grep "\bl\w*="
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'

这样找到了两个匹配的命令别名。

例2.2.2.3 获取以l开头,后面可以接除换行符之外的任意字符的命令别名:

purpleEndurer @ bash $ alias | grep "\bl.*="
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'

命令中正则表达式 "\bl.*=" 中 的

  • . 代表除换行符之外的任意字符

2.2.3 使用 Ctrl+Alt+E 组合键

在终端命令行中输入一个命令后,按下 Ctrl+Alt+E 组合键,假如设置了别名,那么别名自动会变成实际的命令。

例 2.2.3.1 在终端命令行中先输入命令alias查看当前所有的命令别名,再输入命令ls,再按Ctrl+Alt+E,看看实际的命令是什么?

purpleEnduer @ bash $ 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 egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
purpleEnduer @ bash $ ls --color=auto

 

我们先在命令行中输入alias查看当前所有的命令别名,可以看到ls命令别名对应的实际命令是:'ls --color=auto'

然后在命令行中输入ls,接着按Ctrl+Alt+E,这时命令行上的命令变成了ls --color=auto

注意:

  • 这个快捷键并非在所有终端中都可行,有些终端的快捷键会和这个快捷键冲突,这样的话,该方法就不好使了。

3 unalias:删除别名

命令别名定义的太多了,往往带来的不是方便,而是困扰。所以我们也需要掌握删除别名的方法。

要删除一个别名,可以使用 unalias 命令,其命令格式为:

unalias [-a] 别名1 [别名2 ...]

其中:

  • -a 的选项可以删除所有已定义的命令别名。

例3.1 删除命令别名 egrep

purpleEndurer @ bash $ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
purpleEndurer @ bash $ unalias egrep
purpleEndurer @ bash $ alias
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
purpleEndurer @ bash $ 

我们先用alias命令查看当前所有的命令别名,可以看到命令别名egrep

然后用命令unalias egrep来删除命令别名egrep

再用alias命令查看当前所有的命令别名,这次看不到命令别名egrep了。

例3.2 删除命令别名 egrep 、fgrep 和 grep

purpleEndurer @ bash $ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
purpleEndurer @ bash $ unalias egrep fgrep grep
purpleEndurer @ bash $ alias
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
purpleEndurer @ bash $ 

 

我们先用alias命令查看当前所有的命令别名,可以看到命令别名egrep 、fgrep 和 grep

然后用命令unalias egrep fgrep grep 来删除命令别名egrep 、fgrep 和 grep

再用alias命令查看当前所有的命令别名,这次看不到命令别名egrep 、fgrep 和 grep了。

例 3.3 删除所有命令别名

purpleEndurer @ bash $ alias
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
purpleEndurer @ bash $ unalias -a
purpleEndurer @ bash $ alias
purpleEndurer @ bash $ 

我们先用alias命令查看当前所有的命令别名,可以看到命令别名l. 、ll 和 ls

然后用命令unalias -a 来删除所有命令别名

再用alias命令查看当前所有的命令别名,这次看不到任何命令别名了。

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

别名虽好使,但也有弊端,比如定义的别名恰好和某个命令重名了,hell 中执行的将永远都是别名。

在这种情况下,如果我们想执行真正的那个命令而非别名,该怎么办呢?有四种方法可以解决这个问题:

4.1 方法1:使用 Ctrl+Alt+E 组合键  && unalias

在终端命令行中输入一个命令后,按下 Ctrl+Alt+E 组合键,假如设置了别名,那么别名自动会变成实际的命令,如果实际的命令跟我们想要执行的不一致,那么,我们可以使用unalias删除别名定义,之后我们输入和执行的就是实际的命令了。

4.2 方法2:在命令前加上命令文件的绝对路径

例如,pwd命令的功能是显示当前工作目录。

当我们使用命令 alias pwd='ls' 定义了变量别名后,输入pwd回车,显示的就是ls的命令执行结果。

这时要想继续执行原始的pwd命令,那么我们可以在pwd命令前加上命令对应的文件的绝对路径,即:/bin/pwd

purpleEnduer @sh /bin $ pwd
/bin
purpleEnduer @sh /bin $ alias pwd='ls'
purpleEnduer @sh /bin $ pwd
ash        dumpkmap    1inux64        ping6        sync
busybox        echo        ln        printeny    tar
busybox.suid    egrep        login        ps        touch
cat        false        ls        pwd        true
chgrp        fdflush        mkdir        rev        umount
chmod        fgrep        mknod        rm        uname
chown        getopt        mktemp        rmdir        uncompress 
cp        grep        more        rpm        usleep
cpio        gunzip        mount        sed        vi
date        gzip        mv        setarch        watch
dd        hostname    netstat        sh        zcat
df        ipcalc        nice        sleep
dmesg        kill        pidof        stty
dnsdomainame    1inux32        ping        su
purpleEnduer @sh /bin $ /bin/pwd
/bin

 

4.3 方法3:在命令前加上相对路径

除了使用增加绝对路径这种方式外,也可以使用增加相对路径这种方式。

例如:

执行pwd命令,可知当前工作目录为 /home/tc

当我们使用命令 alias pwd='ls' 定义了变量别名后,输入pwd回车,显示的就是ls的命令执行结果。由于/home/tc没有文件和目录,所以命令没有结果显示。

pwd命令对应的文件位于/bin中,

这时要想继续执行原始的pwd命令,除了加上绝对路径即:/bin/pwd

还可以加上相对路径,即: ../../bin/pwd 

purpleEnduer @sh ~ $ pwd
/home/tc
purpleEnduer @sh ~ $ alias pwd='ls'
purp leEnduer @sh  $ pwd
purp leEnduer @sh $ ../../bin/pwd 
/home/tc
purpleEnduer @sh $ /bin/pwd 
/home/tc

purp leEnduer @sh 

 使用绝对路径还是相对路径,主要是看二者中哪个更短 ,这样可以少输一些字符^_^

4.4 方法4:在命令前加上反斜线\

例如:

在pwd命令别名存在的情况下,我们要执行实际的pwd命令,可以使用命令:\pwd

purpleEnduer @sh ~ $ pwd
/home/tc
purpleEnduer @sh ~ $ alias pwd='ls'
purpleEnduer @sh $ pwd
purpleEnduer @sh~$ /pwd
-sh: /pwd: not found
purpleEnduer @sh ~ $ \pwd
/home/tc
purpleEnduer @sh $

 

5 如何让别名永久有效

我们通过 alias 命令设置的别名,仅限于在当前 Shell 中使用,如果系统重启了,那么新设置的别名就失效了。

如果想让别名永久有效的话,就需要把所有的别名加入到($HOME)目录下的 .alias 文件中。

如果你的系统中没有这个文件,你可以创建一个。

然后在 .bashrc 文件中增加这样一段代码:

# Add my aliases
if [ -f ~/.alias ]; then
  . ~/.alias
fi

这样设置后,无论怎样重启系统,.alias 中的别名都有效。

6 为何推荐使用单引号

环境变量PWD保存了当前工作目录的绝对路径,我们可以利用它来了解当前工作目录。

我们先看下面这个命令序列:

purpleEndurer @ bash ~ $ echo $PWD
/home/csdn

可见当前工作目录为 /home/csdn

然后我们定义了别名mypwd="echo $PWD"并执行:

purpleEndurer @ bash ~ $ alias mypwd="echo $PWD"
purpleEndurer @ bash ~ $ mypwd
/home/csdn

别名mypwd执行的结果与 echo $PWD命令是相同的。

接下来,我们把当前工作目录变成/home/csdn/a

purpleEndurer @ bash ~ $ cd a

执行命令  echo $PWD:


purpleEndurer @ bash ~/a $ echo $PWD
/home/csdn/a

命令执行结果 正确。

再试试别名 mypwd:


purpleEndurer @ bash ~/a $ mypwd
/home/csdn

结果不对。

为什么不对了呢?我先看看别名mypwd实际执行的命令:


purpleEndurer @ bash ~/a $ alias mypwd
alias mypwd='echo /home/csdn'

看到了吗?由于我们在定义别名mypwd时使用了双引号,系统在创建这个别名时没有保留p字符串$PWD,而是把它替换成了 PWD的值  /home/csdn。

这样,不管当前工作目录如何变化,别名mypwd始终显示的是 /home/csdn。

找到原因后,我们改用单引号来定义,再查看mypwd实际执行的命令:

purpleEndurer @ bash ~/a $ alias mypwd='echo $PWD'

purpleEndurer @ bash ~/a $ alias mypwd
alias mypwd='echo $PWD'

使用单引号来定义后,$PWD成功保存下来了,没有被替换为它的值。

我们再执行这个别名看看:

purpleEndurer @ bash ~/a $ mypwd
/home/csdn/a 

这次执行结果正确了。

7 参考资料

doskey | Microsoft Learnicon-default.png?t=N7T8https://learn.microsoft.com/zh-cn/windows-server/administration/windows-commands/doskey

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/197126.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

促进高层次人才创新创业,长沙又在“放大招”

“人才”,寥寥数笔,却勾勒出一座城市的发展核心、创新引擎。大力引进高层次人才,更是城市提升综合实力的有效举措。 11月26日,在长沙市委组织部(市委人才工作局)举办“汇聚磅礴力量 全力建设全球研发中心城…

TCP 三次握手和四次挥手(图解)

TCP 三次握手和四次挥手 建立连接-三次握手 什么是三次握手? 简单来说: 客户端向服务器发送 SYN 报文,请求建立连接。服务器收到 SYN 报文后,回复一个 SYNACK 的报文,表示同意建立连接。客户端收到 SYNACK 报文后&am…

unity3d 旋转cube时变形

将cube移到父路径同级,重置再,更改角度,或者将父路径先重置,再将cube移动到父节点下面

股票技术从初级到高级,从实盘进阶到摩尔缠论

一、教程描述 摩尔缠论是什么?一个伟大的缠论分支体系,由顶尖高手创立的缠论分支,这个顶尖高手,江湖上的代号为摩尔,可能是一个人,或者是一群人。摩尔缠论,基于缠论的核心思想与基础理论&#…

Windows下Linkis1.5DSS1.1.2本地调试

1 Linkis: 参考: 单机部署 | Apache Linkis技术分享 | 在本地开发调试Linkis的源码 (qq.com)DataSphere Studio1.0本地调试开发指南 - 掘金 (juejin.cn) 1.1 后端编译 参考【后端编译 | Apache Linkis】】 修改linkis模块下pom.xml,将mysql.connetor.scope修改…

数据结构 | 查找

基本概念 关键字:数据元素中唯一标识该元素的某个数据项的值,使用基于关键字的查找,查找结果应该是唯一的。例如,在由一个学生元素构成的数据集合中,学生元素中“学号”这一数据项的值唯一地标识一名学生。 查找表&a…

从零开始的c语言日记day37——数组指针练习

一、 取地址数组储存在了*p里,里面储存的是整个数组的地址但本质也是第一个元素的地址解引用后1为4个字节所以就可以打印数组了。但一般不用这种方法 这样更方便一些 打印多维数组 如果不用这样传参,用指针传参怎么做呢? Main里函数的arr表示…

22款奔驰GLE450升级原厂360全景影像 超广角的视野

360全景影像影像系统提升行车时的便利,不管是新手或是老司机都将是一个不错的配置,无论是在倒车,挪车以及拐弯转角的时候都能及时关注车辆所处的环境状况,避免盲区事故发生,提升行车出入安全性。 360全景影像包含&…

网工内推 | 外企网工,五险一金,弹性工作,最高30k*14薪

01 金蝶软件(中国)有限公司 招聘岗位:网络工程师 职责描述: 1、合理规划公司网络,保障网络架构的合理性、可靠性及前瞻性; 2、负责公司网络运维,处理日常运维事件,保障网络的稳定可…

基于mvc的大学生家教信息网站系统php+vue

运行环境:phpstudy/wamp/xammp等 开发语言:php 后端框架:Thinkphp5 前端框架:vue.js 服务器:apache 数据库:mysql 数据库工具:Navicat/phpmyadmin 开发软件:hbuilderx/vscode/Dreamweaver/PhpSt…

不同路径 II(力扣LeetCode)动态规划

不同路径 II 题目描述 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。 现在考虑网格中有障碍物。…

freerots启动过程分析(qemu仿真RISC-V架构为例)

1、前言 本文是基于qemu上virt板子适配的freertos系统源码进行讲解qemu安装可参考博客:《qemu源码下载和安装》;freertos移植到qemu上运行可参考博客:《移植freertos到qemu上运行》; 2、汇编代码部分 汇编文件:FreeR…

qt实现一个安卓测试小工具

qt实现一个安卓测试小工具 最终效果:目录结构源码gui.py 主要是按钮,文本控制代码main.py 主要是逻辑代码gui.spec 是打包使用的adb.ui 最终效果: 目录结构 上面2个是打包的生成的不用管 源码 gui.py 主要是按钮,文本控制代码…

vue3怎么提升效率的?为什么vue3比vue2快?效率提升主要在哪些方面?

官方文档中说vue3在 客户端渲染效率比vue2提升了1.3~2倍, SSR渲染效率比vue2提升了2~3倍,那么究竟是怎么提升的呢? 一、静态提升 在 vue3项目中的package.json文件中,可以看到这个 vue/compiler-sfc,它是用来解析(.v…

数据在内存中的存储练习题

数据在内存中的存储练习题 文章目录 数据在内存中的存储练习题1. 练习一2.练习二3. 练习三4. 练习四5. 练习五6. 练习六7. 总结 1. 练习一 #include <stdio.h>int main() {char a -1;signed b -1;unsigned char c -1;printf("a %d b %d c %d", a, b, c)…

PHP+vue+elementui高校学生社团信息管理系统o7q4a

社团是由高校用户依据兴趣爱好自愿组成&#xff0c;按照章程自主开展活动的用户组织。高校社团是实施素质教育的重要途径和有效方式&#xff0c;在加强校园文化建设、提高用户综合素质、引导用户适应社会、促进用户交流等方面发挥着重要作用&#xff0c;是新形势下有效凝聚用户…

Echarts legend图例配置项 设置位置 显示隐藏

Echarts 官网完整配置项 https://echarts.apache.org/zh/option.html#legend 配置项 legend: { }设置图例为圆形 icon: circle,//设置图例为圆形设置图例位置 top: 20%//距离顶部百分之20//y:bottom 在底部显示设置图例 宽度 高度 itemWidth: 10,//设置图例宽度 itemHeight: …

PCL 计算点云图中任意两点的欧式距离

目录 一、算法原理二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 使用PCL实现在可视化界面上用鼠标点选两个点,输出两点的坐标和两点之间的欧式距离。 二、代码…

HttpRunner原来还能这么用,大开眼界!!!

hook机制 Httprunner 框架中的 hook 机制相当于unittest框架中的 setup , teardown 函数&#xff0c;用来进行测试用例执行之前的环境初始化以及测试用例执行完毕之后的环境清理操作。 httprunner 中的 hooks 机制可以用在测试用例层级也可以用在测试步骤层级&#xff0c;其关键…

OSG编程指南<十三>:OSG渲染状态

1、前言 在 OSG 中存在两棵树&#xff0c;即场景树和渲染树。渲染树是一棵以 StateSet 和 RenderLeaf 为节点的树&#xff0c;它可以做到 StateSet 相同的 RenderLeaf 同时渲染而不用切换 OpenGL状态&#xff0c;并且做到尽量少但在多个不同 State 间切换。渲染树在 CullVisito…
最新文章