分享

bash内部命令

 mingjiu 2016-12-05
 bash命令解释套装程序包含了一些内部命令。内部命令在目录列表时是看不见的,它们由Shell本身提供。常用的内部命令有:echo, eval, exec, export, readonly, read, shift, wait和点(.)。下面简单介绍其命令格式和功能。
1.echo
命令格式:echo arg
功能:在屏幕上显示出由arg指定的字串。
2.eval
命令格式:eval args
功能:当Shell程序执行到eval语句时,Shell读入参数args,并将它们组合成一个新的命令,然后执行。
3.exec
命令格式:exec命令参数
功能:当Shell执行到exec语句时,不会去创建新的子进程,而是转去执行指定的命令,当指定的命令执行完时,该进程(也就是最初的Shell)就终止了,所以Shell程序中exec后面的语句将不再被执行。
4.export
命令格式:export变量名 或:export变量名=变量值
功能:Shell可以用export把它的变量向下带入子Shell,从而让子进程继承父进程中的环境变量。但子Shell不能用export把它的变量向上带入父Shell。
注意:不带任何变量名的export语句将显示出当前所有的export变量。
5.readonly
命令格式:readonly变量名
功能:将一个用户定义的Shell变量标识为不可变。不带任何参数的readonly命令将显示出所有只读的Shell变量。
6.read
命令格式:read变量名表
功能:从标准输入设备读入一行,分解成若干字,赋值给Shell程序内部定义的变量。
7.shift语句
功能:shift语句按如下方式重新命名所有的位置参数变量,即$2成为$1,$3成为$2…在程序中每使用一次shift语句,都使所有的位置参数依次向左移动一个位置,并使位置参数$#减1,直到减到0为止。
8.wait
功能:使Shell等待在后台启动的所有子进程结束。wait的返回值总是真。
9.exit
功能:退出Shell程序。在exit之后可有选择地指定一个数位作为返回状态。
10.source 或“.”(点)
命令格式:source Shell程序文件名 或 . Shell程序文件名
功能:在当前的shell中强制执行.sh脚本,而不是新建一个子shell在子shell中执行。从指定的shell 文件中读入所有命令语句并在当前进程中执行。强制执行,忽略权限,可以改变父shell的环境。与直接调用./Shell程序文件名的区别:接调用./Shell程序文件名来执行shell是在一个子shell里运行的,执行后结果并没有反应到父shell里,不过source不同,他就是在本shell中执行的,运行结果会改变当前shell的环境,所以能看到结果。

内建的命令包含在shell本身里面。当内建的命令的名字被用作一个简单命令的第一个词时,shell 直接执行那个命令,而不创建新的进程。内建命令在实现那些单独的程序不可能或者不便实现的某些功能时时很有必要的,bash支持3种内建的命令:

*Bourne Shell内建命令:
:, ., break, cd, continue, eval, exec, exit, export, getopts, hash, pwd, readonly, return, set, shift, test, [, times, trap, umask and unset.

*Bash内建命令:
alias, bind, builtin, command, declare, echo, enable, help, let, local, logout, printf, read, shopt, type, typeset, ulimit and unalias.

*特殊内建命令:
当Bash在POSIX模式运行,特殊内建命令和其他内建命令有3个方面的区别:
1.特殊内建命令在shell函数在命令查找期间先被找到。
2.如果一个特殊内建命令返回一个错误状态,一个非交互shell就会退出。
3.在命令完成后在该命令之前的赋值语句仍然在shell环境中起作用。

POSIX特殊内建命令是::, ., break, continue, eval, exec, exit, export, readonly, return, set, shift, trap and unset.

简单的对应关系简单描述如下:
* .: 把SHELL脚本当作当前进程的一部分执行.
* :: 返回0或者true.
* [: Bourne Shell Builtins.
* alias: 别名.
* bg: 在后台放置一个挂起的任务.
* bind: Bash Builtins.
* break: 从一个循环控制结构中退出.
* builtin: Bash Builtins.
* cd: 改变到其它的工作目录.
* command: Bash Builtins.
* compgen: Programmable Completion Builtins.
* complete: Programmable Completion Builtins.
* continue: 直接转到循环的下一次迭代的开始处.
* declare: 声名变量.
* dirs: Directory Stack Builtins.
* disown: Job Control Builtins.
* echo: 显示出它后边的参数.
* enable: Bash Builtins.
* eval: 扫描并计算命令行.
* exec: 执行一个shell脚本或者程序并替换掉当前进程.
* exit: 从当前的shell中退出.
* export: 把一个变量的值放在被调用的环境中(输出变量).
* fc: Bash History Builtins.
* fg: 把一个在后台执行的程序提交到前台.
* getopts: 分析一个shell脚本的参数.
* hash: Bourne Shell Builtins.
* help: Bash Builtins.
* history: 查看执行命令的历史记录.
* jobs: 显示后台任务的列表.
* kill: 给一个进程或者作业发送一个信号.
* let: 数学计算后面的表达式的值.
* local: 声明局部变量.
* logout: 登出shell.
* popd: 目录栈出栈.
* printf: Bash Builtins.
* pushd: 目录栈入栈.
* pwd: 显示工作目录.
* read: 从标准输入中读入一行.
* readonly: 把一个变量名为只读.
* return: 返回值.
* set: 设置shell标志或命令行参数变量,如不加参数则列出所有变量.
* shift: 提升每个命令行参数.
* shopt: Bash Builtins.
* source: Bash Builtins.
* suspend: Job Control Builtins.
* test: 参数比较.
* times: 显示当前shell以及其子进程的运行时间.
* trap: 捕获一个信号.
* type: 显示出每个参数怎样被解释为一个命令.
* typeset: 声名变量同declare.
* ulimit: Bash Builtins.
* umask: 返回文件创建时的掩码值.
* unalias: 删除别名.
* unset: 删除一个变量或者函数.
* wait: 等待后台进程的结束.

简单应用描述:
: [arguments] 
不做任何事,除了[arguments]一些参数展开及一些特定重导向的作业外。永远返回零,它的用法跟true一样。 
*************************
. filename [arguments] 
source filename [arguments] 
由filename中读取命令,并执行。 
您会在/etc/rc.d/*中发现很多 
. /xxxx 
的指令,而xxxx的permission都不是可执行的。事实上,在tcsh中,需要用 
source /xxxx 
来做同样的指令。 
注意到"."的后面是有空格的(比较一下". /"跟"./",不一样)。filename是内含指令的纯文字档即可,无须chmod 755 filename。 

filename : my_source 
DEV=lo 
IP=127.0.0.1 
NETMASK=255.0.0.0 
BROADCAST=127.255.255.255 

ifconfig $IP netmask $NETMASK broadcast $BROADCAST dev $DEV 

接下来 
. my_source 
或 
source my_source 

便可执行该script,而不需要"chmod 755 my_source" 

*************************
alias [name[=value] ...] 
昵称命令 
例如您如果来自DOS的世界,对UNIX的指令不习惯,可用alias来修改,以符合您的习惯。 


alias ls="ls --color" 
alias dir="ls" 
alias cd..="cd .." 
alias copy="cp -f" # dangerous, recommend, "cp -i" 
alias del="rm -f" # dangerous, recommend, "rm -i" 
alias move="mv -f" # dangerous, recommend, "mv -i" 
alias md="mkdir" 
alias rd="rmdir" 

*************************
unalias [-a] [name ...] 
unalias取消alias的设定。"unalias -a"将全部alias取消。 


unalias copy 

*************************
bg [jobspec] 
将指定任务放到背景中,如果 jobspec未指定,内定为目前的。 

*************************
fg [jobspec] 
将指定任务放到前景中,如果 jobsepc没有指定,那么内定为目前的。 

*************************
jobs [-lnp] [ jobspec ... ] 
第一种形式列出目前正在工作的任务。 
-l : 除了列出一般资讯外,还列出Process IDs。 
-p : 仅列出该工作群"首脑"(Process group leader)的Process ID. 
-n : 则仅列出有改变的jobs的状态。 
如果给定jobspec,输出资讯则只有该jobspec。 

返回值为零,除非有非法的选项发生。 

jobs -x command [ args ... ] 

如果使用第二种形式(-x),jobs取代指定的command及args,并执行返回其Exit Status。 

*************************
kill [-s sigspec | -sigspec] [pid | jobspec] ... 
将sigspec的信号送到pid或jobspec。 
sigspec可以是 SIGKILL/KILL这种形式或是信号号码。如果sigspec是signal name,则大小写无关,而且可以没有SIG。 
kill -l [signum] 
列出信号名称。 

[foxman@foxman bash]# kill -l 
1) SIGHUP    2) SIGINT    3) SIGQUIT   4) SIGILL 
5) SIGTRAP   6) SIGIOT    7) SIGBUS    8) SIGFPE 
9) SIGKILL   10) SIGUSR1   11) SIGSEGV   12) SIGUSR2 
13) SIGPIPE   14) SIGALRM   15) SIGTERM   17) SIGCHLD 
18) SIGCONT   19) SIGSTOP   20) SIGTSTP   21) SIGTTIN 
22) SIGTTOU   23) SIGURG   24) SIGXCPU   25) SIGXFSZ 
26) SIGVTALRM  27) SIGPROF   28) SIGWINCH  29) SIGIO 
30) SIGPWR 

*************************
wait [n] 
等待指定的行程,并返回其结束状态。n可以是个jobspec或Process ID。如果n未指定,则等待所有的子行程,及返回值为零。若n为不存在的job或process,则返回127。否则,返回值为最后一个 job/process的Exit Status。 

*************************
bind [-m keymap] [-lvd] [-q name] 
bind [-m keymap] -f filename 
bind [-m keymap] keyseq:function-name 
显示出目前readline的按键及链结函数设定或是巨集。 

-m keymap : 设定keymap binding。 
-l : 显示出所有readline function的名称。 
-v : 显示出目前的function name及bindings。 
-d : 显示出function name及bindings。 
-f filename : 从filename读取key bindings。 
-q function : 询问那个按键触发function。 

*************************
break [n] 
跳出控制回圈for/while /until中使用。如果有指定n,则跳出n层。n必须是大于等于1。若n大于巢状圈数,则所有的圈都会跳离。返回值回零。 

*************************
continue [n] 
还原控制回圈for/while /until中使用。如果有指定n,则返回n层。n必须是大于等于1。若n大于巢状圈数,则还原到最上层。返回值回零。 

*************************
exit [n] 
离开程式。n是Exit Status。 

*************************
return [n] 
在function中使用。n为返回值,其作用与Exit Status一样。 

*************************
builtin shell-builtin [arguments] 
执行内建函数。当您定义了与内建函数相同的指令时,可用此命令来执行内建函数。 

*************************
cd [dir] 
更换目录到dir。如果没有指定,内定为 HOME所指定的目录。 

*************************
command [-pVv] command [arg ...] 
用command指定可取消正常的shell function寻找。只有内建命令及在PATH中找得到的才会被执行。"-p"选项,搜寻命令的方式是用PATH来找。"-V"或"-v"选项,会显示出该命令的一些简约描述。 

*************************
declare [-frxi] [name[=value]] 
typeset [-frxi] [name[=value]] 
宣告参数并给它们设定属性。如果没有给定名称,将会显示各参数值。 

-f : 仅使用函数名称。 
-r : 将name设为readonly。 
-x : 将name输出给后续环境使用。 
-i : 该参数被设为integer来使用,可用于算术表述。 

用"+"时,关闭该属性。 

*************************
dirs [-l] [+/-n] 
显示目前记忆的目录。目录可透过pushd/popd来操作。 

+n : 显示开始的记录n个。 
-n : 显示结尾的记录n个。 
-l : 显示较多的资讯。 

*************************
echo [-neE] [arg ...] 
输出显示 args,由空白分隔。返回值永为零。 

-n : 不跳行。 
-e : 启动"\"符号的解译。 
-E : 将ESC解译功能取消。 

"\a" : alert(bell),发出声响。 
"\b" : backspace,倒退。 
"\c" : suppress trailing newline,不跳行。 
"\f" : form feed,跳行跳格。 
"\n" : new line,新行。 
"\r" : carriage return,回到行起点。 
"\t" : horizontal tab,水平跳位。 
"\v" : vertical tab,垂直跳位。 
"\\" : 输出"\"。 
"\nnn" : 输出ASCII Code号码nnn(八进位)。 

*************************
enable [-n] [-all] [name ...] 
启动或关闭内建函数命令。使用"-n"将所有指定命令皆关闭,否则都是启动的。如果只有"-n"参数,它将会显示所有关闭的函数。如果只有"-all",它将会显示所有内建命令。 

*************************
eval [arg ...] 
读取args,并将args合为一个命令,然后执行。其返回值成为eval的返回值。如果没有参数,eval返回True。 

*************************
exec [[-] command [arguments]] 
当命令执行时,该命令取代shell,没有新的process产生。如果第一个参数是"-",shell会将"-"放入第零个参数,传给 command。 

*************************
export [-nf] [name[=word]] ... 
export -p 
将name输出给环境,给往后的命令使用。"-f"选项表示name是函数。"-p"显示出所有export的名称。"-n"移除name。 

*************************
set [--abefhkmnptuvxldCHP] [-o option] [arg ...] 
-a : 自动将变数标记为可让后面环境所使用。 
-b : 立即报告被终结的背景程式状态。 
-e : 当命令(simple-command,见后面)返回非零值时,立即跳出。 
-f : 取消pathname expansion。 
-h : 找出所记忆的函数命令位置。 
-k : 所有keyword参数都放到环境中。 
-m : 监督模式。 
-n : 读取命令,但不要执行。可用于语法检查。 
-p : 打开privileged模式。 
-t : 当读取一个命令并执行后,立即离开。 
-u : 当参数展开时,把unset参数当成是错误。 
-v : 列出shell input lines。 
-x : 在展开每个simple-command后,bash显示展开值在PS4上。 
-l : 储存并还原name binding在for语法中。 
-d : 关闭hasing command搜寻。 
-C : 跟`noclobber=`一样。请见内定参数一节。 
-H : 启动! style history substitution。 
-P : 在使用像cd这种指令时,不要跟随symbolic links。 
-- : "--"之后,没有参数跟在后面。 
- : 指定将所有后面的参数当成是位置参数。 
-o option-name : option-name可以是以下之一 
allexport : 与"-a"相同。 
braceexpand : 启动Brace Expansion。这是内定设定。 
emacs : 使用emacs-style命令列编辑界面。 
errexit : 与"-e"相同。 
histexpand : 与"-H"相同。 
ignoreeof : 效果跟`IGNOREEOF=10`一样。 
interactive-commands : 允许#做为解。 
monitor : 与"-m"相同。 
noclobber : 与"-C"相同。 
noexec : 与"-n"相同。 
noglob : 与"-f"相同。 
nohash : 与"-d"相同。 
notify : 与"-b"相同。 
nounset : 与"-u"相同。 
physical : 与"-P"相同。 
posix : Bash行为修改为Posix 1003.2标准。 
privileged : 与"-p"相同。 
verbose : 与"-v"相同。 
vi : 使用vi-style命令列编辑程式。 
xtrace : 与"-x"相同。 

*************************
unset [-fv] [name ...] 
移除对映于 name的参数。要注意PATH、IFS、PPID、PS1、PS2、UID、EUID不能unset。若RANDOM、SECONDS、LINENO、 HISTCMD被unset,它们会丧失原有意义,既始它们后来被重设也一样。返回值为True,除非name是不能被unset的。 

*************************
fc [-e ename] [-nlr] [first] [last] 
fc -s [pat=rep] [cmd] 
修正命令。 

*************************
getopts optstring name [args] 
解析位置参数。 

*************************
help [pattern] 
显示协助资讯。 

*************************
history [n] 
history -rwan [filename] 
没有参数时,会显示所下命令的历史记录。带有参数"n"则显示最后n个。 

其它参数如下: 
-a : 新增"新历史"到历史档中。 
-n : 读取尚未读到历史中的记录。 
-r : 读取filename做为历史档,并用它为目前历史记录。 
-w : 将现有历史记录写到filename中。 

*************************
let arg [arg ...] 
算术表述。请参考算术表述一节。 

*************************
local [name[=value] ...] 
产生一个局部参数。如果用于function,则其作用围在function内及其子函数。 

*************************
logout 
离开login shell。 

*************************
popd [+/-n] 
移除目录堆叠。"+n"移除上面n 个,"-n"移除下面n个。 

*************************
pushd [dir] 
pushd +/-n 
将目录新增到目录堆叠的最上面。"+n"旋转该堆叠,使第n个目录变成最上面。"-n"旋转该堆叠,使倒数第n个目录变成最上面。 

*************************
pwd 
列出目前工作目录的绝对路径。 

*************************
read [-r] [name ...] 
读进一行,然后第一个字设到第一个name,第二个设到第二个name,依此类推。如果没有name在参数中,则read会将值设到REPLY。返回值为零,除非遇到 End-Of-File。若有"-r"选项,则"\n"被考虑为该行的一部份。 

*************************
readonly [-f] [name ...] 
readonly -p 
将给定的name标记为readonly。如果是"-f"选项,则函数也一样被标记为readonly。"-p"会列出所有readonly的name。"--"取消检查剩余的参数。 

*************************
shift [n] 
Positional Parameters从n+1...开始,会被改为$1...。n若为零,则没有改变。n若未给定,则内定为1。n必须是非负数,并且小于或等于$#。若 n大于$#,则没有改变。返回值为零,除非n大于$#或小于零。 

*************************
suspend [-f] 
暂停这个shell的执行,直到它收到SIGCONT信号。"-f"选项则是叫login shell不要抱怨,不过还是一样暂停。返回状态零,除非该shell是个login shell,而且没有"-f"选项。 

*************************
test expr 
[ expr ] 
我们在 Exit Status的部份已经说过了,不再重。 

*************************
times 
列出该shell的累积的使用者及系统时间及从 shell执行的process时间,返回值为零。 

------------------------------------------------------------------------------
trap [-l] [arg] [sigspec] 
当收到sigspec信号时,执行arg命令。"-l"显示出信号名称及号码。 

*************************
type [-all] [-type | -path] name [name ...] 
没有参数的状况下,它会显示出shell如何解译name做为命令。如果有"-type",它将会显示alias、 keyword、function、builtin或file。如果有"-path"的参数,它将会显示该命令的路径,找不到的话,不显示任何东西。如果有"-all"的参数,它将会显示所有可执行name的可能路径。type接受"-a"、"-t"、"-p"做为缩写。 

*************************
ulimit [-SHacdfmstpnuv [limit]] 
ulimit提供了对shell的可获取资源控制的功能。 

-a : 报告目前所有限制。 
-c : 设定最大可产生的core档案。 
-d : 行程资料段(process's data segment)最大值。 
-f : 可被这个shell产生的最大档案。 
-m : resident set size最大值。 
-s : 堆叠最大值。 
-t : CPU TIME最大值(以秒计算)。 
-p : pipe size in 512-byte blocks的最大值。 
-n : 可开启的file descriptors最大值。 
-u : 单一使用者可使用的最大process数。 
-v : 该shell最大虚拟记忆体可用值。 

所有项目是以1024做为单位。 

*************************
umask [-S] [mode] 
将使用者的file- creation mask设为mode。"-S"选项将mask印成符号形式。

--------------------示例应用------------------------
####################################################
使用内置的set和shopt命令设置bash选项
set命令可以用来定制shell环境,使用选项“o”来打开或者关闭选项。例如打开选项:set -o 选项,关闭选项目:set +o 选项。例如要打开vi交互式命令行编辑,则如下:

debian:~# set -o   #查看当前设置情况
allexport          off
braceexpand        on
emacs              on
errexit            off
errtrace           off
functrace          off
hashall            on
histexpand         on
history            on
ignoreeof          off
interactive-comments    on
keyword            off
monitor            on
noclobber          off
noexec             off
noglob             off
nolog              off
notify             off
nounset            off
onecmd             off
physical           off
pipefail           off
posix              off
privileged         off
verbose            off
vi                 off    #关闭中
xtrace             off

[root@localhost ~]# set -o vi   #把vi选项打开

内置set命令选项
选项名     快捷开关     含义
allexport     -a     从这个选项中被设置开始就自动标明要输出的新变量或修改过的变量,直至选项被复位
braceexpand     -B     打开花括号扩展,它是一个默认设置
emacs           使用emacs内置编辑器进行命令行编辑,是一个默认设置
errexit     -e     当命令返回一个非零退出状态(失败)时退出。读取初始化文件时不设置
histexpand     -H     执行历史替换时打开!和!!扩展,是一个默认设置
history           打开命令行历史、默认为打开
ignoreeof           禁止用EOF(Ctrl+D)键退出shell。必须键入exit才能退出。等价于设置shell变量IGNOREEOF=10
keyword     -k     将关键字参数放到命令的环境中
interactive-comments           对于交互式shell,把#符后面的文本作为注释
monitor     -m     设置作业控制
noclobber     -C     防止文件在重定向时被重写
noexec     -n     读命令,但不执行。用来检查脚本的语法。交互式运行时不开启
noglob     -d     禁止用路径名扩展。即关闭通配符
notify     -b     后台作业完成时通知用户
nounset     -u     扩展一个未设置的变量时显示一个错误信息
onecmd     -t     在读取和执行命令后退出
physical     -P     设置时,在键入cd或pwd禁止符号链接。用物理目录代替
privileged     -p     设置后,shell不读取.profile或ENV文件,且不从环境继承shell函数,将自动为setuid脚本开启特权
verbose     -v     为调试打开verbose模式
vi           使用vi内置编辑器进行命令行编辑
xtrace     -x     为调试打开echo模式

####################################################     
shopt命令是set命令的一种替代,很多方面都和set命令一样,但它增加了很多选项。可有使用“-p”选项来查看shopt选项的设置。“-u”开关表示一个复位的选项,“-s”表示选项当前被设置。

debian:~# shopt -p    #查看当前设置情况
shopt -u cdable_vars
shopt -u cdspell
shopt -u checkhash
shopt -u checkwinsize
shopt -s cmdhist
shopt -u compat31
shopt -u dotglob
shopt -u execfail
shopt -s expand_aliases
shopt -u extdebug
shopt -u extglob
shopt -s extquote
shopt -u failglob
shopt -s force_fignore
shopt -u gnu_errfmt
shopt -u histappend
shopt -u histreedit
shopt -u histverify
shopt -s hostcomplete
shopt -u huponexit
shopt -s interactive_comments
shopt -u lithist
shopt -s login_shell
shopt -u mailwarn
shopt -u no_empty_cmd_completion
shopt -u nocaseglob
shopt -u nocasematch
shopt -u nullglob
shopt -s progcomp
shopt -s promptvars
shopt -u restricted_shell
shopt -u shift_verbose
shopt -s sourcepath
shopt -u xpg_echo

[root@localhost ~]# shopt -s cdspell   #把cdspell选项打开
[root@localhost ~]# shopt -p cdspell    #打印cdspell设置
shopt -s cdspell
[root@localhost ~]# cd /raot            #故意拼写错误
/root
[root@localhost ~]# pwd                 #查看当前目录
/root
[root@localhost ~]# cd /usr/loca/bin   # 故意拼写错误
/usr/local/bin
[root@localhost bin]# pwd               #查看当前目录  
/usr/local/bin
[root@localhost bin]# shopt -u cdspell #把cdspell选项打开
[root@localhost bin]# shopt -p cdspell #打印cdspell设置
shopt -u cdspell
[root@localhost bin]# cd /raot         #故意拼写错误
-bash: cd: /raot: 没有那个文件或目录     #进入目录错误

shopt命令选项
选项     含义
cdable_vars     如果给cd内置命令的参数不是一个目录,就假设它是一个变量名,变量的值是将要转换到的目录
cdspell     纠正cd命令中目录名的较小拼写错误。检查的错误包括颠倒顺序的字符,遗漏的字符以及重复的字符。如果知道一处修改,正确的路径就打印出,命令将继续。只用于交互式shell
checkhash     bash在试图执行一个命令前,先在哈希表中寻找,以确定命令是否存在。如果命令不存在,就执行正常路径搜索
checkwinsize     bash在每个命令后检查窗口大小,如果有必要,就更新LINES和COLUMNS的值
cmdhist     bash试图将一个多行命令的所有行保存在同一个历史项中。这使得多行命令的重新编辑更方便
dotglob     bash在文件名扩展的结果中包括以点(.)开头的文件名
execfail     如果一个交互式shell不能执行指定给exec内置命令作为参数的文件,它不会退出。如果exec失败,一个交互式shell不会退出
expand_aliases     别名被扩展。默认为打开
extglob     打开扩展的模式匹配特征(正常的表达式元字符来自Korn shell的文件名扩展)
histappend     当shell退出时,历史清单将添加到以HISTFILE变量的值命名的文件中,而不是覆盖文件
histreedit     如果readline正被使用,用户有机会重新编辑一个失败的历史替换
histverify     如果设置,且readline正被使用,历史替换的结果不会立即传递给shell解析器。而是将结果行装入readline编辑缓冲区中,允许进一步修改
hostcomplete     如果设置,且readine正被使用,当正在完成一个包含@的词时bash将试图执行主机名补全。默认为打开
huponexit     如果设置,当一个交互式登陆shell退出时,bash将发送一个SIGHUP(挂起信号)给所有的作业
interactive_comments     在一个交互式shell中,允许以#开头的词以及同一行中其他的字符被忽略。默认为打开
lithist     如果打开,且cmdhist选项也打开,多行命令将用嵌入的换行符保存到历史中,而无需在可能的地方用分号来分隔
mailwarn     如果设置,且bash用来检查邮件的文件自从上次检查后已经被访问,将显示消息“The mail in mailfile has been read”
nocaseglob     如果设置,当执行文件名扩展时,bash在不区分大小写的方式下匹配文件名
nullglob     如果设置,bash允许没有匹配任何文件的文件名模式扩展成一个空串,而不是它们本身
promptvars     如果设置,提示串在被扩展后再经历变量和参量扩展。默认为打开
restricted_shell     如果shell在受限模式下启动就设置这个选项。该值不能被改变。当执行启动文件时,不能复位该选项,允许启动文件发现shell是否是受限的
sourcepath     如果设置,source内置命令使用PATH的值来寻找包含作为参数提供的文件的目录。默认为打开
source     点(.)的同义词
shift_verbose     如果该选项设置,当移动计数超过位置参量个数时,shift内置命令将打印一个错误消息
####################################################
trap -- 捕捉信号
简介
查看信号

$ kill -l
查看当前信号绑定

$ stty -a
trap 处理信号

trap 在 bash 中是一个内置命令:
$ type trap
trap is a shell builtin

用法如下 (man trap 中搜索 trap):
trap [-lp] [[arg] sigspec ...]

-l
作用同 "kill -l" 列出所有信号
-p
输出当前和各个信号绑定的“命令”
arg
如果是空字符串,那么就执行捕捉到的后面列表中的信号的本来行为;如果 arg 不知空字符串,当捕捉到后面信号列表中的信号时就执行此命令。
sigspec
可以是多个 "trap -l" (或 "kill -l") 输出的信号列表中的信号名或信号数字值

$ trap hello EXIT  # 绑定 EXIT 信号发生后的执行程序为 hello (trap 只管绑定,不管是否存在。
$ trap -p  # 输出当前有那些绑定
trap -- 'hello' EXIT

trap捕捉到信号之后,可以有三种反应方式:
* 执行一段程序来处理这一信号
* 接受信号的默认操作
* 忽视这一信号

调用程序处理信号
trap commands signal-list

常见信号
HUP(1)     挂起,通常因终端掉线或用户退出而引发
INT(2)     中断,通常因按下Ctrl+C组合键而引发
QUIT(3)     退出,通常因按下Ctrl+\组合键而引发
ABRT(6)     中止,通常因某些严重的执行错误而引发
ALRM(14)     报警,通常用来处理超时
TERM(15)     终止,通常在系统关机时发送
####################################################
type -- Describe a command, for each name, indicate how it would be interpreted if used as a command name.
type [-tpa] name
参数:
:不加任何参数时,则 type 会显示出那个 name 是外部指令还是 bash 内建的指令!
-t  :当加入 -t 参数时,type 会将 name 以底下这些字眼显示出他的意义:
file    :表示为外部指令;
alias   :表示该指令为命令别名所设定的名称;
builtin :表示该指令为 bash 内建的指令功能;
-p  :如果后面接的 name 为指令时,会显示完整档名(外部指令)或显示为内建指令;
-a  :会将由 PATH 变数定义的路径中,将所有含有 name 的指令都列出来,包含 alias
范例:
范例一:查询一下 ls 这个指令是否为 bash 内建?
[root@linux ~]# type ls
ls is aliased to `ls --color=tty'
# 没有加上任何参数,仅列出 ls 这个指令的最主要使用情况
[root@linux ~]# type -t ls
alias
# -t 参数则仅列出 ls 这个指令的最主要使用情况说明
[root@linux ~]# type -a ls
ls is aliased to `ls --color=tty'
ls is /bin/ls
# 利用所有方法找出来的 ls 相关资讯都会被列出来!

范例二:那么 cd 呢?
[root@linux ~]# type cd
cd is a shell builtin

透过 type 这个指令的用途,我们可以知道每个指令是否为 bash 的内建指令。 此外,由于利用 type 搜寻后面的名称时,如果后面接的名称并不能以执行档的状态被找到, 那么该名称是不会被显示出来的。举例来说,您的 FC4 应该不会有 vbird 这个指令吧?! 输入 type -p vbird 看一下,果然没有输出任何资料!而如果您输入的是 type -p touch 呢? 则会出现 /bin/touch,所以,这个 type 也可以用来作为类似 which 指令的用途。
####################################################
printf – 格式化输出
printf是bash 2-3.x 的内建命令, 跟内建命令「echo」一样,都是把讯息打印到终端上,不同之处是printf 具有更多的选项和格式化的工能,看命令的名字就是「print formatted」的意思。

printf 格式化的的选项如下
%a -- 十六进制浮点数字,用 lowercase letter 显示
例: printf "%a\n" 16
在% 和 a 之间可用数字控制显示格式,如
printf "%50a\n" 16

%A -- 如上,以 uppecase letter 显示
%b -- 将 \ 的结果扩展
例: printf "%b\n" \\100
%c -- 显示一个单一的子母
例: printf "%c\n" string
得到 s , 和%a 一样,可在两者之间用数字控制显示格式,
%d -- 整数
例: printf "%d\n" 100000
它还支援数字用「,」由高位每三个数字以「,」分开,格式是
printf "%'d\n" 10000000
这个我在这里参加个一个讨论,详见
http://bbs./viewthr ... &例tra=page%3D6
%e -- 以科学记号法浮点数显示
例: printf "%e\n" 10.00
%f -- 浮点数显示
例: printf "%f\n" 10
此外它也支援像 %d 的 "%'d" 格式。
%g --  据手册所说是样 bash 根据数值在 %e 和 %f 之间选择显示形式,但我的测试却像 seq -f 的'%g' 的数字显示方式, 在 % 和 g 之间插入 「0数字」的方式就会在不足的整数前面加上一些「0」, 如 printf "%03g" 1 2 12 123 得到 001 002 012 123在 % 和 g 之间没「0」的数字视为控制显示格式。
%i -- 和 %d 一样
%o -- 以八进制显示数字,只能用整数
例: printf "%o\n" 8
%q -- 倨手册原文为
Quote a string so it can be read properly by a shell script
大意为以 " " 保护字符使脚本正确读入。
%s -- 和%q 相反,原文为
Display an unquoted string
我试出%s 和 %q 的结果为
[hto@localhost ~]$ printf "%q\n" str
str
[hto@localhost ~]$ printf "%q\n" str
str
[hto@localhost ~]$ printf "%s\n" str
str
[hto@localhost ~]$ printf "%s\n" ""str""
str
[hto@localhost ~]$ printf "%q\n" ""str""
str
[hto@localhost ~]$ printf "%q\n" '"str"'
\"str\"
[hto@localhost ~]$ printf "%q\n" "'str'"
\'str\'
[hto@localhost ~]$ printf "%q\n" "\'str\'"
\\\'str\\\'
[hto@localhost ~]$ printf "%s\n" "\'str\'"
\'str\'
%u -- 这个也是显示整数,跟 %d 差不多, 也支援 "%'" 的格式,但在测试下发现它和 %d 如以以下方式打印字符的话,不但不会报错,还返回一些数字。
[hto@localhost ~]$ printf "%u\n" '"str"'
115
[hto@localhost ~]$ printf "%u\n" str
bash: printf: str: invalid number
0
[hto@localhost ~]$ printf "%u\n" 115
115
[hto@localhost ~]$ printf "%u\n" "str"
bash: printf: str: invalid number
0
[hto@localhost ~]$ printf "%u\n" '"str"'
115
[hto@localhost ~]$ printf "%'u\n" 1234
1,234
[hto@localhost ~]$ printf "%d\n" '"str"'
115
[hto@localhost ~]$ printf "%d\n" "'str'"
115
[hto@localhost ~]$ printf "%d\n" "'fuck'"
102
[hto@localhost ~]$ printf "%u\n" "'fuck'"
102
[hto@localhost ~]$

%x -- 以十六进制整数 lowercase letter显示数字     
例: printf "%x\n" 16
它也支援像 「%0数字g」的方式,整数不足指定的数位在前面加上 「0」
%X -- 同上,以 Uppercase letter 显示数字
%% -- 就是显示 %
printf 也可将八进制的数字显示成十进制,方法是在八进制的数字前加上「\」和
「0」, 如 printf "%d\n" \0101
其它如 \b 就是倒格(backspace) , \f Form feed , \n 是新行 ,\r 回键 ,\t 是 tab
, \v vertical tab , \' 是 single quote character ,\\ 就是一个 「\」。

最后,太长的数字 printf 会报错,
[hto@localhost ~]$ printf "%d\n" 123456789123456789012
bash: printf: warning: 123456789123456789012: 数值运算结果超出范围
9223372036854775807

#################################################### 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多