16
如何学习 Bash Shell LI Daobing <[email protected]> Kingsoft Inc. 2008-04-06

如何学习Bash Shell

Embed Size (px)

Citation preview

如何学习 Bash Shell

LI Daobing <[email protected]>Kingsoft Inc.2008-04-06

目录

• 命令,管道与重定向• 环境变量• 扩展与 quote• 流程控制• 调试与安全• 附 1: 进程查看与调试工具 , gdb 以外的世界• 附 2: 好用的命令介绍

命令,管道与重定向 (1)

• 常用命令列表o sudo apt-get install manpages-posix; dpkg -L manpages-posixo sudo apt-get install coreutils info; info coreutilso help

• 管道o 标准输入 (0) ,标准输出 (1) ,标准错误 (2)o 将上一个程序的标准输出链接到下一个命令的

标准输入 : ls | less

命令,管道与重定向 (2)

• 重定向o ls > ls.log; ls >> ls.log; ls 2>&1o ">": 将标准输出更改为 ls.log 文件 ( 覆盖 )

"2> ls.log": 将标准错误更改为 ls.log 文件 ( 覆盖 )o ">>": 将标准输出更改为 ls.log 文件 ( 追加 )o "2>&1": 将标准输出的设备复制到标准错误o make 2>&1 | less

1. 将标准输出更改为管道设备 ( 管道优先级最高,其余的重定向指令从左往右处理 )

2. 将标准输出的设备复制到标准错误o 参考 bash(1)(REDIRECTION) , mkfifo(1)

命令,管道与重定向 (3)

• 特殊设备o /dev/null: 空设备,读的时候会马上得到 EOF, 写操

作是空操作 ( 黑洞 ) ,可用来抛弃输出o /dev/zero: 零设备,读的时候会得到无限的 '\0' ,写

操作也是空操作o /dev/urandom: 随机数设备,读的时候能得到随机数 :

$ cat /dev/urandom | head -c 16 | hexdump -C00000000 e8 fe c0 6e 6f ec 02 89 12 d8 5c 39 da b6 df dd |...no.....\9....|00000010

环境变量 (1)

• 系统环境变量o 使用 env 查看o 使用 export A=1 设置o 会被子进程继承o 只能为字符串

• BASH 的变量o 使用 set/declare 查看o 使用 A=1 设置o 不被子进程继承o 可以为字符串,字符串数组,整数等

扩展与 quote (1)

• 参数的文件名扩展o ls *.png; ls ?.jpg; ls [a-z]*

• 变量扩展 : $A, ${A}• 使用其他命令的输出作为参数

o echo `pwd`; A=`pwd`o A=1.gif; convert $A `basename $A .gif`.png

• 其他扩展o $#, $0, $1, ..., "$@", "$*"

扩展与 quote (2)

• quotingo 需要 quote 的字符 : |&;()<> space tab ! \ o 用 \ 来 quote: \|, \&o 用 '...': 消除所有岐义,不得包含单引号 (')o 用 "...": 与 '...' 类似,但允许变量替换 ($A) ,或者命

令替换 `pwd` ,也允许使用 \"\$\` 。o 其他 : "$@", "$*", $'...'

流程控制 (1)

• &&, || , for, while, if, case• &&, ||

o cmd1 || { echo "cmd1 failed"; exit 1; }o test -f .bashrc && cat .bashrc

• foro for x in *.jpg; do

convert "$x" "`basename $x .jpg`.png"done

• while:o x=1; while test $x -lt 100; do echo $x; x=`expr $x + 1`; done

流程控制 (2)

• ifo if [ `id -u` = 0 ]; then echo "you are root"; fi

• caseo case "$TERM" in

xterm*|rxvt*)PROMPT_COMMAND='...';;screen*)PROMPT_COMMAND='....';;*);;esac

调试与安全 (1)

• bash -n: 仅检查语法,不执行• set -x: 在执行前打印实际命令 ( 已完成所有替换 )• set -C: 防止在流重定向时覆盖文件 ( 可放入

.bashrc, 减少误操作风险 )• mktemp, tempfile: 如何使用临时文件 / 临时目录• trap: 截获信号

进程查看与调试工具 , gdb 以外

• ps aux: 列出所有进程• pstree -pAa: 进程树• lsof -p 12345: 列出进程打开的文件• lsof .bashrc: 列出文件被打开的情况• fuser -m /dev/sdb1: 列出分区被打开的情况• strace ls: 跟踪进程使用系统调用的情况• strace -p 12345: 跟踪已经执行的进程

进程查看与调试工具 , gdb 以外

• ltrace: 跟踪动态库调用情况• valgrind: 跟踪程序内存使用情况

好用的命令介绍

• find . -name *.hpp | xargs grep HELLO• find . -name *.hpp -print0 | \

xargs -0 grep HELLO• find . -name *.hpp -exec grep HELLO {} \;• awk, sed: 专业的流编辑器 ( 字符串函数 )• nc: TCP/IP 网络发送 / 监听 / 代理工具,可以帮

助你在系统无法完全正常启动时输出错误报告或者输入数据。

• autossh/tsocks: 自用的 tsocks 代理工具

好用的命令介绍

• dsh: 同时管理多台机器的工具• keychain: ssh/pgp 信任辅助工具 ( 假定你的 ssh

信任需要输入密码 , 那么如何在脚本中安全的使用 ?)

• iptraf: IP 流量监视工具

Thanks for your attention