bash shell 自定义函数命令持久化生效问题

目录
  • 1. 背景
  • 2. 登陆shell时读取命令的流程
    • 2.1 /etc/profile
    • 2.2 $HOME目录下的启动文件流程
  • 3. 在命令行上使用函数
    • 3.1 在.bashrc 文件中定义函数
      • 3.1.1 直接定义函数
      • 3.1.2 读取函数文件
  • 4. 验证

1. 背景

每次登陆shell 遇到需要敲一行命令来查看一个问题或者升级一个应用时就感觉很麻烦,可以考虑将函数放到特定的位置,这样每次登陆shell时就会重新载入。

2. 登陆shell时读取命令的流程

当你登录Linux系统时,bash shell会作为登录shell启动。登录shell会从5个不同的启动文件里读取命令:

  • /etc/profile
  • $HOME/.bash_profile
  • $HOME/.bashrc
  • $HOME/.bash_login
  • $HOME/.profile

/etc/profile文件是系统上默认的bash shell的主启动文件。系统上的每个用户登录时都会执行这个启动文件。
另外4个启动文件是针对用户的,可根据个人需求定制。

2.1 /etc/profile

/etc/profile文件是bash shell默认的的主启动文件。只要你登录了Linux系统,bash就会执行
/etc/profile启动文件中的命令

2.2 $HOME目录下的启动文件流程

剩下的启动文件都起着同一个作用:提供一个用户专属的启动文件来定义该用户所用到的环境变量。大多数Linux发行版只用这四个启动文件中的一到两个:

  • $HOME/.bash_profile
  • $HOME/.bashrc
  • $HOME/.bash_login
  • $HOME/.profile

注意,这四个文件都以点号开头,这说明它们是隐藏文件(不会在通常的ls命令输出列表中
出现)。它们位于用户的HOME目录下,所以每个用户都可以编辑这些文件并添加自己的环境变
量,这些环境变量会在每次启动bash shell会话时生效

shell会按照按照下列顺序,运行第一个被找到的文件,余下的则被忽略:

  • $HOME/.bash_profile
  • $HOME/.bash_login
  • $HOME/.profile

注意,这个列表中并没有$HOME/.bashrc文件。这是因为该文件通常通过其他文件运行的。

.bash_profile启动文件会先去检查HOME目录中是不是还有一个叫.bashrc的启动文件。如果有的话,会先执行启动文件里面的命令。

[zoms@chm ~]$ cat ~/.bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin

export PATH

到这来可以看到 .bashrc 是如何引入启动的。

3. 在命令行上使用函数

在命令行上创建函数
通过单行方式创建函数

[zoms@chm ~]$ function divem { echo $[ $1 / $2 ]; }
[zoms@chm ~]$ divem 100 5
20

3.1 在.bashrc 文件中定义函数

在命令行上直接定义shell函数的明显缺点是退出shell时,函数就消失了。对于复杂的函数来说,这可是个麻烦事。
一个非常简单的方法是将函数定义在一个特定的位置,这个位置在每次启动一个新shell的时候,都会由shell重新载入。
最佳地点就是.bashrc文件。bash shell在每次启动时都会在主目录下查找这个文件,不管是交互式shell还是从现有shell中启动的新shell。

3.1.1 直接定义函数

可以直接在主目录下的.bashrc文件中定义函数。许多Linux发行版已经在.bashrc文件中定义了一些东西,所以注意不要误删了。把你写的函数放在文件末尾就行了。这里有个例子。

 cat .bashrc
# .bashrc
# Source global definitions
if [ -r /etc/bashrc ]; then
 . /etc/bashrc
fi
function addem {
 echo $[ $1 + $2 ]
} 

该函数会在下次启动新bash shell时生效。随后你就能在系统上任意地方使用这个函数了。

3.1.2 读取函数文件

只要是在shell脚本中,都可以用source命令(或者它的别名点操作符)将库文件中的函数添加到你的.bashrc脚本中。

 cat .bashrc
# .bashrc
# Source global definitions
if [ -r /etc/bashrc ]; then
 . /etc/bashrc
fi
. /home/rich/libraries/myfuncs 

还可以在当前用户下的.bashrc 文件添加自定义别名和函数

[zoms@chm ~]$ cat ~/.bashrc
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=

# User specific aliases and functions
. /home/zoms/shell/zcm_update.sh

注意:source命令有个快捷的别名,称作点操作符(dot operator)。要在shell脚本中运行zcm_update库文件,只需添加下面这行:
. /home/zoms/shell/zcm_update.sh

zcm_update 可以定义参数传参

[zoms@chm ~]$ cat  /home/zoms/shell/zcm_update.sh
zcm_update(){

 if [ $# -eq 0  ]
 then
   echo Parameter exception
   return 1
 fi
 echo $1
 sudo supervisorctl stop $1;sudo docker stop $1;sudo docker rm $1;sudo supervisorctl update $1;sudo supervisorctl start $1;sleep 3;sudo supervisorctl status $1
 echo sudo supervisorctl status $1
}

4. 验证

# 改造前
# 通过多条命令重建nms-monitor应用
sudo supervisorctl stop nms-test;sudo docker stop nms-test;sudo docker rm nms-test;sudo supervisorctl update nms-test;sudo supervisorctl start nms-test;sleep 3;sudo supervisorctl status nms-test
# 改造后
zcm_update nms-test

到此这篇关于bash shell 自定义函数命令持久化生效的文章就介绍到这了,更多相关bash shell 自定义函数命令内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Bash Shell中的select命令简单使用示例

    前言 今天刚好写了一个自动化打包脚本,再次使用到了bash shell,好幸福的感觉.这里主要是想介绍一下select命令,这个命令可以帮助我们完成菜单选择功能. 格式 我今天也是第一次使用select流程控制,在php.Java.C这些语言中并没有实现select功能.Bash Shell中,select格式如下: select $var in ${list[@]} do statements that can use $var done 在select执行时,会根据list数组给出选择菜单,

  • bash shell命令行选项与修传入参数处理

    在编写shell程序时经常需要处理命令行参数,本文描述在bash下的命令行处理方式.选项与参数:如下命令行:   复制代码 代码如下: ./test.sh -f config.conf -v --prefix=/home -f为选项,它需要一个参数,即config.conf, -v 也是一个选项,但它不需要参数.--prefix我们称之为一个长选项,即选项本身多于一个字符,它也需要一个参数,用等号连接,当然等号不是必须的,/home可以直接写在--prefix后面,即--prefix/home,

  • shell(bash)下“time” 命令的输出详解

    前言 相信大家都知道bash下time是一个很有用的命令,它可以为一段脚本或一个程序的执行计时,这通常在粗略比较程序执行效率的时候很方便.但是你会发现,time命令输出的时间文字不能被简单地重定向,例如重定向至一个文本文件,只能显示在屏幕上,这对于非交互计时很不方便. 例如: $ time find . -name "mysql.sh" >1.txt real 0m0.081s user 0m0.060s sys 0m0.020s $ time find . -name &quo

  • bash shell 自定义函数命令持久化生效问题

    目录 1. 背景 2. 登陆shell时读取命令的流程 2.1 /etc/profile 2.2 $HOME目录下的启动文件流程 3. 在命令行上使用函数 3.1 在.bashrc 文件中定义函数 3.1.1 直接定义函数 3.1.2 读取函数文件 4. 验证 1. 背景 每次登陆shell 遇到需要敲一行命令来查看一个问题或者升级一个应用时就感觉很麻烦,可以考虑将函数放到特定的位置,这样每次登陆shell时就会重新载入. 2. 登陆shell时读取命令的流程 当你登录Linux系统时,bash

  • 列出所有Bash Shell内置命令的方法示例

    前言 Shell有很多内置在其源代码中的命令.这些命令是内置的,所以Shell不必到磁盘上搜索它们,执行速度因此加快.不同的Shell内置命令有所不同. 内置命令包含在 bash shell 本身里面.我该如何在 Linux / Apple OS X / *BSD / Unix 类操作系统列出所有的内置 bash 命令,而不用去读大篇的 bash 操作说明页? shell 内置命令就是一个命令或一个函数,从 shell 中调用,它直接在 shell 中执行. bash shell 直接执行该命令

  • linux shell 自定义函数方法(定义、返回值、变量作用域)

    一.定义shell函数(define function) 语法: [ function ] funname [()] { action; [return int;] } 说明: 1.可以带function fun() 定义,也可以直接fun() 定义,不带任何参数. 2.参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值. return后跟数值n(0-255 实例(testfun1.sh): #!/bin/sh fSum 3 2; function fSum

  • linux shell自定义函数(定义、返回值、变量作用域)介绍

    linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.下面说说它的定义方法,以及调用需要注意那些事项. 一.定义shell函数(define function) 语法: [ function ] funname [()] { action; [return int;] } 说明: 1.可以带function fun() 定义,也可以直接fun() 定义,不带任何参数. 2.参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值. retu

  • shell自定义函数的6个特点总结

    最近系统的学习了一下shell的函数,总体感觉根其他语言的函数差不多,不过它也有自身的特点 一,调用函数必须在定义函数的后,不然会报错的 复制代码 代码如下: fun fun (){  echo "aaaaaa" } fun 返回结果如下: 复制代码 代码如下: [root@krlcgcms01 mytest]# sh fun.sh  fun.sh: line 1: fun: command not found       //第一次调用fun是报错的,fun没有定义  aaaaaa 

  • shell自定义函数及参数调用解析

    一.定义函数 复制代码 代码如下: function fname(){statements;} 或 复制代码 代码如下: fname(){statements;} 二.调用函数 只需要使用函数名,即可调用某个函数:$ fname ; #执行函数 可以传递参数给函数,并由脚本进行访问:fname arg1 arg2; # 传递参数 以下是函数fname的定义.在函数fname中,包含了各种访问函数参数的方法. 复制代码 代码如下: fname(){  echo $1, $2; # 访问参数1和参数

  • Shell $?获取函数返回值或者上一个命令的退出状态

    $? 是一个特殊变量,用来获取上一个命令的退出状态,或者上一个函数的返回值. 所谓退出状态,就是上一个命令执行后的返回结果.退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1,这和C语言的 main() 函数是类似的. 不过,也有一些命令返回其他值,表示不同类型的错误. 1) $? 获取上一个命令的退出状态 编写下面的代码,并保存为 test.sh: #!/bin/bash if [ "$1" == 100 ] then exit 0 #参数正确,退出状态为0

  • Shell脚本函数定义和函数参数

    一.Shell函数 本教程目前为止所有脚本都是从头到尾执行.这样做很好,但你也许已经注意到有些脚本段间互相重复. shell允许将一组命令集或语句形成一个可用块,这些块称为shell函数. shell中函数的定义格式如下: 复制代码 代码如下: 函数名(){     command1     command2     ...     commandN     [ return value ] } 如果愿意,可在函数名前加上关键字function,这取决于使用者. 复制代码 代码如下: funct

  • PHP递归复制、移动目录的自定义函数分享

    虽然复制一个目录是文件操作的基本功能.但PHP中也没有给出特定的函数,同样需要自定义一个递归函数实现.要复制一个包含多个子目录的目录,将涉及文件的复制.目录创建等操作.复制一个文件可以通过PHP提供的copy()函数完成,创建目录可以使用mkdir()函数.定义函数时,首先对源目录进行遍历,如果遇到的是普通文件,直接使用copy()函数进行复制.如果遍历时遇到一个目录,则必须建立该目录,然后再对该目录下的文件进行复制操作,如果还有子目录,则使用递归重复操作,最终将整个目录复制完成.自定义的递归函

随机推荐