首页 > 系统相关 >shell 脚本中使用自定义的alias别名

shell 脚本中使用自定义的alias别名

时间:2024-05-07 19:35:12浏览次数:22  
标签:shell 自定义 命令 ll alias ls shopt

摘自:https://blog.csdn.net/cscrazybing/article/details/41285287

alias, 假名,别名,bash的一个内建命令,用来给常用的较长的命令定义个简短的名称。
  alias命令的基本格式为alias [word[='command']], []内为可选项。定义word为command的别名。若=’command’部分省略,则输出word之前的定义,未定义则报错。单独的alias列出当前环境中所有可用的别名。通常来讲,关于alias,知道这么多就行了。但在使用alias的过程中还有一些问题需要注意。
  如果bash的expand_aliases选项没有被设置,那么在非交互式shell中alias不会被执行展开。也就是说,在shell脚本中,使用alias会导致”command not found”的错误。使用shopt命令来设置expand_aliases选项:

交互模式下alias 扩展默认是开启的,脚本模式下默认是关闭的 

alias 扩展的名称是 expand_aliases 

1
shopt -s expand_aliases

(执行 help shopt 可以查看该shell内置命令的帮助信息)

CommandDesc
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
   

设置这个选项,可以在bashrc中,也可以在需要使用alias的脚本中。

  再就是,如果在脚本中的同一行内,先定义alias,接着马上使用该alias是会产生错误的。原因就是bash在解释执行脚本过程中,每次读取至少一行命令,alias展开就是在读取时进行的,读取之后(alias展开也完成了)才开始执行命令(当然,还会有参数扩展等其他操作)。由于进行alias展开时该行的alias命令尚未执行,所以其中的alias就不会被展开。举个例子吧,

1
2
shopt -s expand_aliases
alias ll='ls -lh'; alias e='exit'; ll; e

执行该脚本,会发现ls 和exit命令均未被执行,错误提示ll和e命令未找到。所以,脚本中,alias命令最好单独成行。
  同样的问题也出现在组合命令中,比如while, for循环等结构,

1
2
3
4
5
6
7
8
9
10
11
12
shopt -s expand_aliases
for i in `seq 1 10`
do
    alias ll='ls -lh'
    ll # command ll not found.
done
 
for i in `seq 1 10`
do
    alias ll='ls -lh'
    ll # now ok
done

  类似地,在shell函数中alias也会出现同样的问题。事实上,shell中的函数只不过是一种特殊的、有名字和参数的、使用{}的组合命令,所以单行函数中’}’之前是必须要有分号的,就像普通的{}组合命令一样。之所以非单行函数不需要分号,是因为换行可以代替分号。
  最后,bash中alias不可以使用位置参数(据说csh)是可以的,也就是说,不可以使用alias mkcd=’mkdir $1 && cd $1’这样的命令(这种命令允许你在alias中按照自己的意愿安排参数的位置,例如对于alias ll=’ls $1 -lh’,ll file被展开为ls file -lh,而不是简单的展开为ls -lh file)。如果在bash中确实需要这样做,就应该使用函数来完成,比如,function mkcd() { ‘mkdir $1 && cd $1; }.

Tags:  命令.  

标签:shell,自定义,命令,ll,alias,ls,shopt
From: https://www.cnblogs.com/LiuYanYGZ/p/18178207

相关文章

  • ECharts自定义提示框浮层内容
    因为提示框内容支持字符串模板和回调函数两种形式字符串模板模板变量有{a},{b},{c},{d},{e},分别表示系列名,数据名,数据值等等,但是trigger属性为axis的时候它数据条就很多了,就可以用{a0},{a1},{a2}这样子去拿数据跟数组下标一样(官网有详细示例)示例:在`option`中的`tooltip`里边写......
  • Docker网络:Docker0、容器互联技术--link、自定义网络、实战部署Redis集群
    一、Docker网络●--理解Docker0在干净的Linux环境上安装docker(将docker的所有镜像、容器先删除,干干净净!)实验:1、查看本地网络信息ipaddr可见有三个网卡信息:lo:本地(回环)地址;ens:虚拟机或云服务器(内网)地址;docker0:docker网络地址。问题:docker是如何处理容器网络访问......
  • 【Python-Json】自定义类输入json序列化、json的读取与写入
    AI问答Questionjson支持numpy数组么Answer不幸的是,标准的JSON格式不直接支持NumPy数组.JSON是一种用于存储和交换数据的文本格式,它有限的数据类型只包括对象(object)、数组(array)、数字(number)、字符串(string)、布尔值(true/false)、空值(null)等.因此,无法直接将......
  • blazor中的PageTitle输出keywords和description,自定义组件
    在blazor的PageTitle中不具备输出keywords和description的功能,而如果直接使用<mate>标签,输出中文时会变成乱码,所以我给大家推介下面的代码解君愁:1@*<PageTitle>@Title-@AppTitle</PageTitle>*@2<HeadContent>3@(newMarkupString($"<metaname=\"keywords\"......
  • BeanShell使用场景和语法
    BeanShell有自己的语法,同时支持java语法;使用场景:1.数据库断言2.RAS加密、混合加密3.接口签名4.调用开发给的jar包、class文件、java文件5.csv数据驱动之后的断言6.跨线程组共享变量分类:1.前置处理器:BeanShell2.后置处理器:BeanShell3.定时器:BeanShell4.采......
  • 基于1500/1200 PLC的webserver---用户自定义页面
    1.创建html页面页面需要包含字符集信息:<metahttp-equiv="content-type"content="text/html;charset=utf-8">包含AWP命令的html文件,大小限制为64KB最简单的页面自动刷新:<metahttp-equiv="Refresh"content="10">2.AWP指令AWP命令公式中""之......
  • 一起了解开源自定义表单的优势表现
    随着社会的进步和科技的发展,越来越多的中小企业希望采用更为先进的软件平台,助力企业实现高效率的流程化管理。低代码技术平台、开源自定义表单已经慢慢走入大众视野,成为一款灵活、高效的数字化转型工具。流辰信息专注于低代码技术平台的研发与创新工作,竭尽全力为通信业、电力、高......
  • [shell] fishshell -- 教程
    [shell] fishshell -- 教程   一、fishshell 官网  1.https://fishshell.com/     二、fishshell  文档 1.https://fishshell.com/docs/current/index.html     三、fishshell 教程1.h......
  • VS2017+QT5.9.1 自定义loggerControl
    创建自定义类LoggerControl继承QListWidget#pragmaonce#include<QListWidget>#include"Helper.h"#include<QTime>#include<QPainter>classLoggerControl:publicQListWidget{Q_OBJECTpublic:LoggerControl(QWidget*paren......
  • 删除字符串中与另一个字符串中的相同字母的自定义函数
    #include<stdio.h>/********************************************************************* 函数名称: str_DestDel* 函数功能:删除一个字符串中与另一个字符串中的相同字母并且不区分大小写* 函数参数:* @strA 需要操作的字符串* @strB 作为参考的字......