set 是 shell 内置命令之一,它可以用来设置 shell 的相关选项以及环境变量等。当运行不带任何参数的 set 命令时,会列出所有的变量。下面是 set 命令的一些选项:-n :只读取脚本,但不实际执行。这个选项常用于在脚本的调试阶段发现脚本中的语法错误,像 make 一个 Makefile 文件时,经常也会用到此选项。比如 make -n ,又如 sh -n example.sh ,这里实际上都是调用了 set 这个选项。如下面检查一个有语法错误的脚本:
引用 [beyes@localhost shell]$ sh -n menu.sh menu.sh: line 8: unexpected EOF while looking for matching `'' menu.sh: line 10: syntax error: unexpected end of file-x :进入跟踪方式,这样会显示出脚本执行每一条命令及其参数。这个选项在调试脚本时也是相当有用的。比如下面一个脚本内容为:
? 1 2 3 4 5 6 #!/bin/bash echo "hello" echo "world" date ls -al带有 -x 选项的运行:
引用 [beyes@localhost shell]$ sh -x menu.sh + echo hello hello + echo world world + date Sun May 29 18:53:43 PDT 2011 + ls -al total 12 drwxrwxr-x. 2 beyes beyes 4096 May 29 18:53 . drwx------. 25 beyes beyes 4096 May 29 18:53 .. -rw-rw-r--. 1 beyes beyes 249 May 29 18:53 menu.sh在上面的输出中,每条被执行的命令前面都有一个 "+" 号。也可以将 set -x 这条命令放入脚本中,那么在 shell 中执行这个脚本时,只需要 sh menu.sh 或者脚本有可执行权限时直接 ./menu.sh ,这样也能在输出时看到被跟踪的命令。-e :如果命令带有非 0 值就会立即退出。在 shell 中,一个表达式为真或者一条命令成功执行,那么会返回 0 值。看下面的脚本执行情况:
? 1 2 3 4 5 6 7 8 #!/bin/bash echo "hello" echo "world" ifdown eth0 #普通用户没有权限配置网卡 date直接运行脚本:
引用 [beyes@localhost shell]$ sh menu.sh hello world Users cannot control this device. Sun May 29 19:01:18 PDT 2011带有 -e 选项运行脚本:
引用 [beyes@localhost shell]$ sh -e menu.sh hello world Users cannot control this device.对比两者的输出,带有 -e 选项的运行方式使脚本在运行在 ifdown eth0 这条命令时脚本退出了,因为普通用户没有权限禁用网卡,所以此命令执行必然失败,从而返回值为非零。-f / +f :取消与恢复通配符(man 手册里说 Disable file name generation,这里 file name generation 就是通配符的意思)。注意,在使用 set 命令时,具有开关作用的选项,选项前面为 "-" 号的为“关闭”,选项前面有 "+" 的为“打开”。
引用 [beyes@localhost shell]$ ls *.sh ls: cannot access *.sh: No such file or directory [beyes@localhost shell]$ set +f [beyes@localhost shell]$ ls *.sh menu.sh在上面的例子中,在使用 -f 后,无法展开通配符 "*" 号;使用 "+f" 恢复后,即可恢复通配符的功能。-C :不允许输出重定向覆盖已有的文件。如:
引用 [beyes@localhost shell]$ set -C [beyes@localhost shell]$ touch file1 [beyes@localhost shell]$ echo "hello world" > file1 bash: file1: cannot overwrite existing file [beyes@localhost shell]$ set +C [beyes@localhost shell]$ echo "hello world" > file1set 命令还有一个比较有用的 -o 选项,它后面接选项名,这些选项名就是上面选项的完整名字。其中有一个 vi 的选项名更显实用,比如:set -o vi ,你就可以在敲打命令时使用具有 vi 风格的编辑方法。比如在默认情况下,可能在敲打一个长命令时,当走到命令末位,忽然发现命令的前部写错了点什么然后要返回时,不得不按左键一直往回走,这样就可能比较费时了。如果事先使用了 set -o vi ,那么你要回到命令头部时,只要跟 vi 里编辑一样,先按下 ESC 键,然后再按下 Shift + ^ 组合键即可。下面是 -o 可接的选项名:
选项名快捷键开关含义allexport-a从这个选项被设置开始就自动标明要输出的新变量或修改过的变量,直至选项被复位braceexpand-B打开花括号扩展,是一个缺省设置emacs使用emacs内置编辑器进行命令行编辑,是一个缺省设置errexit-e当命令返回一个非0退出状态(失败)时退出,读取初始化文件时不设置histexpand-H执行历史替换时打开!和!!扩展,是一个缺省设置history打开命令行历史;缺省为打开ignoreeof禁止用EOF(Control-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时禁止符号连接。用物理目录代替posix如缺省操作不符合POSIX标准就改变shell行为privileged-p设置时,shell不读,profile或ENV文件,且不从环境继承shell函数;自动为setuid脚本开启特权verbose-v为调试打开verbose模式vi使用vi内置编辑器进行命令行编辑xtrace-x为调试打开[font='bitstream]跟踪模式默认情况下,按下 ctrl + d 组合键会发出 EOF ,从而退出终端。比如在打开一个终端窗口时,按下 ctrl + d ,终端窗口关闭。如果此时不希望这样,那么就用set -o ignoreeof 这时你如果按下 ctrl + d 时,shell 会提示你:
引用 [beyes@localhost ~]$ set -o ignoreeof #按下 ctrl + d [beyes@localhost ~]$ Use "exit" to leave the shell.所以此时需要用 exit 命令退出终端。如果希望恢复,那么就用 set +o ignoreeof 。