设为首页 收藏本站
查看: 671|回复: 0

在shell脚本中使用alias-lan323900

[复制链接]

尚未签到

发表于 2018-8-24 13:35:12 | 显示全部楼层 |阅读模式
  Linux shell有交互式与非交互式两种工作模式。我们日常使用shell输入命令得到结果的方式是交互式的方式,而shell脚本使用的是非交互式方式。
  shell提供了alias功能来简化我们的日常操作,使得我们可以为一个复杂的命令取一个简单的名字,从而提高我们的工作效率。在交互式模式下,shell的alias扩展功能是打开的,因此我们可以键入自己定义的alias别名来执行对应的命令。
  但是,在非交互式模式下alias扩展功能默认是关闭的,此时仍然可以定义alias别名,但是shell不会将alias别名扩展成对应的命令,而是将alias别名本身当作命令执行,如果shell内置命令和PATH中均没有与alias别名同名的命令,则shell会“抱怨”找不到指定的命令。
  那么,有没有办法在非交互式模式下启用alias扩展呢?答案是使用shell内置命令shopt命令来开启alias扩展选项。shopt是shell的内置命令,可以控制shell功能选项的开启和关闭,从而控制shell的行为。shopt的使用方式如下:
  shopt -s opt_name                 Enable (set) opt_name.
  shopt -u opt_name                 Disable (unset) opt_name.
  shopt opt_name                    Show current status of opt_name.
  alias扩展功能的选项名称是expand_aliases,我们可以在交互式模式下查看此选项是否开启:sw@gentoo ~ $ shopt expand_aliases
  expand_aliases  on
  sw@gentoo ~ $
  可见在交互式模式下alias扩展功能的确是开启的,因此我们才能使用alias别名。
  我们编写一个脚本来验证一下非交互式模式下alias扩展的设置:
  #!/bin/bash --login
  alias echo_hello="echo Hello!"
  shopt expand_aliases
  echo_hello
  shopt -s  expand_aliases
  shopt expand_aliases
  echo_hello
  脚本执行结果如下:
  sw@gentoo ~ $ ./test.sh
  expand_aliases  off
  ./test.sh: line 5: echo_hello: command not found
  expand_aliases  on
  Hello!
  sw@gentoo ~ $
  可以看到,在非交互式模式下alias扩展功能默认是关闭的,但是我们可以用shopt来将其开启。
  另外,alias别名只在当前shell有效,不能被子shell继承,也不能像环境变量一样export。可以把alias别名定义写在.bashrc文件中,这样如果启动交互式的子shell,则子shell会读取.bashrc,从而得到alias别名定义。但是执行shell脚本时,启动的子shell处于非交互式模式,是不会读取.bashrc的。
  不过,如果你一定要让执行shell脚本的子shell读取.bashrc的话,可以给shell脚本第一行的解释器加上参数:
  #!/bin/bash --login
  --login使得执行脚本的子shell成为一个login shell,login shell会读取系统和用户的profile及rc文件,因此用户自定义的.bashrc文件中的内容将在执行脚本的子shell中生效。
  还有一个简单的办法让执行脚本的shell读取.bashrc,在脚本中主动source ~/.bashrc即可。
  http://blog.phpdr.net/%E5%9C%A8shell%E8%84%9A%E6%9C%AC%E4%B8%AD%E4%BD%BF%E7%94%A8alias.html


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-556029-1-1.html 上篇帖子: 73条日常shell命令汇总 下篇帖子: 管理Redis进程的Shell脚本
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表