7.3.5. shell内建命令

所谓的shell内建命令,就是由bash自身提供的命令,而不是文件系统中的某个可执行文件

例如,用于进入或者切换目录的cd命令,该命令不是一个外部文件,只要在shell中就可以运行这个命令

可以用type来确定一个命令是否是内建命令:

yinwg@yinwg-ThinkPad-E470:~/tmp/shell$ type cd
cd 是 shell 内建

yinwg@yinwg-ThinkPad-E470:~/tmp/shell$ type ifconfig
ifconfig 是 /sbin/ifconfig

可见cd是一个shell内建命令,而ifconfig是一i个外部文件

通常来说,内建命令比外部命令执行的更快,执行外部命令时不但会触发磁盘i/o还需要fork出一个单独的进程来执行,执行完成后再退出。而执行内建命令相当于调用当前shell进程的一个函数

bash shell内建命令

命令

说明

:

扩展参数列表,执行重定向操作

.

读取并执行指定文件中的命令(在当前shell环境中)

alias

为指定的命令定义一个别名

bg

将作业以后台模式运行

bind

将键盘序列绑定到一个readline函数或宏

break

退出for while select until循环

builtin

执行指定的shell内建命令

caller

返回活动子函数调用的上下文

cd

将当前目录切换为指定目录

command

指行指定的命令,无需进行通常的shell查找

compgen

为指定的单词生产可能的补全选项

complete

显示指定的单词是如何补全的

compopt

修改指定单词的补全选项

continue

继续执行for while select until循环的下一次迭代

declare

声明一个变量或变量类型

dirs

显示当前存储目录的列表

disown

从进程作业表中删除指定的作业

echo

将指定字符串输出到STDOUT

enable

启用或禁用指定的内建shell命令

eval

将指定的参数拼接成一个命令,然后执行该命令

exec

用指定命令替换shell进程

exit

强制shell以指定的退出状态码退出

export

设置子shell子进程可用的变量

fc

从历史记录中选择命令列表

fg

将作业以前台模式运行

getopts

分析指定的位置参数

hash

查找并记住指定命令的全路径名

help

显示帮助文件

history

显示命令历史记录

jobs

列出活动作业

kill

向指定进程ID发送一个系统信号

let

计算一个数学表达式中的每个参数

local

在函数中创建一个作用域受限的变量

logout

退出登录shell

mapfile

从STDIN读取数据行,并将其加入索引数组

popd

从目录栈中删除记录

printf

使用格式化字符串显示文本

pushd

向目录栈添加一个目录

pwd

显示当前工作目录的路径名

read

从STDIN读取一行数据并将其赋给一个变量

readarray

从STDIN读取数据行并将其放入索引数组

readonly

从STDIN读取一行数据并将其赋值给一个不可修改的变量

return

强制函数以某个值退出,这个值可以被调用脚本提取

set

设置并显示环境变量的值和shell属性

shift

将位置参数一次向下降一个位置

shopt

打开/关闭控制shell可选行为的变量值

source

读取并执行指定文件中的命令(在当前shell环境中)

suspend

暂停shell的执行,直到收到一个SIGCONT信号

test

基于指定条件返回退出状态码0或1

times

显示累计的用户和系统时间

trap

如果收到了指定的系统信号,执行指定的命令

type

显示指定的单词如果作为命令将会被如何解释

typeset

申明一个变量或者变量类型

ulimit

为系统用户设置指定的资源上限

umask

为新建的文件和目录设置默认权限

unalias

删除指定的别名

unset

删除指定的环境变量或shell属性

wait

等待指定的进程完成,并返回退出状态码

alias unallias用法

alias用来设置命令别名,可以将一些比较长的命令进行简化。alias命令的作用只限于该次登入的操作

alias 新的命令='原命令 -选项/参数'

alias -p #打印已经设置号的命令别名

alias ll="ls -l --color=tty"
alias rm='rm -i'

unalias -a  #取消所有命令别名

unalias ll

作业控制bg fg jobs disown wait suspend kill用法

bg命令用于将作业放到后台运行,使前台可以执行其他任务,与命令后面加 & 的效果使一样的

jobs命令用于显示linux中的任务列表即任务状态,包括后台运行的任务。该命令可以显示任务号以及对应的进程号,其中任务号是以普通用户的视角进行的,而 进程号则是从系统管理员的角度来看的。一个任务可以对应一个或者多个进程号

jobs (选项) (参数)
-l:显示进程号
-p:仅显示任务对应的进程号
-n:显示任务状态的变化
-r:仅输出运行状态(running)的任务
-s:仅输出停止状态(stopped)的任务
bg 1    #后台执行任务号为1的任务
fg 1    #将任务号为1的任务放在前台执行

disown命令用于从当前shell中移除作业

disown [-h] [-ar] [jobspec ... | pid ...]
-h:标记每个作业标识符,这些作业将不会在shell中收到sighub信号
-a:移除所有作业
-r:移除运行的作业
jobspec:要移除的作业标识符
pid:要移除的作业pid

注解

disown只是移除作业,其实作业并没有停止运行

wait命令用来等待指令完成,直到其执行完毕后返回终端。该指令在等待作业时,在作业标识号前必须添加备份号”%”

wait %3 #等待作业号为3的作业完成

suspend命令执行shell的挂起操作,直到收到一个SIGCONT信号

kill发送信号到作业或者进程

kill -s sig 信号名称
kill -n sig 信号名称对应的数字
-l 列出信号名称

bind命令 builtin命令

bind命令用于显示和设置命令行的键盘序列绑定功能,通过这一命令可以提高命令行中操作效率

builtin命令用于执行指定shell内部命令,当系统中定义了与shell内部命令相同的函数时,使用builtin显式地执行shell内部命令,从而忽略定义的shell函数。

bind:用法: bind [-lpvsPSVX] [-m 键映射] [-f 文件名] [-q 名称] [-u 名称] [-r 键序列] [-x 键序列:shell-命令] [键序列:readline-函数 或 readline-命令]
bing (选项)
-f<按键配置文件>:载入指定的按键配置文件
-l:列出所有功能
-m<按键配置>:指定的按键配置
-q<功能>:显示指定功能的按键
-v:列出目前的按键配置与其功能

实例

bind -x '"\C-l":ls -l'      #直接按CTRL+L就列出目录

declare

declare (选项) (参数)
选项:
-f:仅显示函数
r:将变量设置为只读
x:指定的变量会成为环境变量,可供shell以外的程序来使用
i:设置值可以是数值,字符串或运算式
参数:
shell变量  格式为"变量名=值"

trap命令

trap用于捕捉信号和其他事件执行命令

信号是一种进程间的通信机制,应用程序收到信号后,有三种处理方式:忽略、默认、或捕捉。如果是SIG_IGN,就忽略信号,如果是SIG_DFT,则会采用系统默认的处理动作,通常是终止进程 或者忽略该信号。如果给该信号指定了一个处理函数(捕捉),则会中断当前进程正在执行的任务转而去执行该信号的处理函数

trap "rm -f ${WORKDIR}/tmpfile;exit" 2  #收到信号2时执行删除文件操作
trap '' 2   #忽略信号
trap 1 2    #重置

shift命令

shift用来移动位置参数

cat test.sh
#!/bin/bash

echo $1 $2 $3
shift 2
echo $1 $2 $3

bash test.sh a b c d e f
a b c
c d e