Slide 1

Slide 1 text

如何学习Bash Shell LI Daobing Kingsoft Inc. 2008-04-06

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

命令,管道与重定向(1) ●常用命令列表 ○ sudo apt-get install manpages-posix; dpkg -L manpages-posix ○ sudo apt-get install coreutils info; info coreutils ○ help ●管道 ○标准输入(0),标准输出(1),标准错误(2) ○将上一个程序的标准输出链接到下一个命令的 标准输入: ls | less

Slide 4

Slide 4 text

命令,管道与重定向(2) ●重定向 ○ls > ls.log; ls >> ls.log; ls 2>&1 ○">": 将标准输出更改为 ls.log 文件(覆盖) ■ "2> ls.log": 将标准错误更改为 ls.log 文件(覆盖) ○">>": 将标准输出更改为 ls.log 文件(追加) ○"2>&1": 将标准输出的设备复制到标准错误 ○make 2>&1 | less ■ 1. 将标准输出更改为管道设备 (管道优先级最高,其余的重 定向指令从左往右处理) ■ 2. 将标准输出的设备复制到标准错误 ○参考 bash(1)(REDIRECTION) , mkfifo(1)

Slide 5

Slide 5 text

命令,管道与重定向(3) ●特殊设备 ○/dev/null: 空设备,读的时候会马上得到 EOF, 写操作 是空操作(黑洞),可用来抛弃输出 ○/dev/zero: 零设备,读的时候会得到无限的 '\0',写操 作也是空操作 ○/dev/urandom: 随机数设备,读的时候能得到随机数: $ cat /dev/urandom | head -c 16 | hexdump -C 00000000 e8 fe c0 6e 6f ec 02 89 12 d8 5c 39 da b6 df dd |...no.....\9....| 00000010

Slide 6

Slide 6 text

环境变量(1) ●系统环境变量 ○使用 env 查看 ○使用 export A=1 设置 ○会被子进程继承 ○只能为字符串 ●BASH 的变量 ○使用 set/declare 查看 ○使用 A=1 设置 ○不被子进程继承 ○可以为字符串,字符串数组,整数等

Slide 7

Slide 7 text

扩展与quote (1) ●参数的文件名扩展 ○ls *.png; ls ?.jpg; ls [a-z]* ●变量扩展: $A, ${A} ●使用其他命令的输出作为参数 ○echo `pwd`; A=`pwd` ○A=1.gif; convert $A `basename $A .gif`.png ●其他扩展 ○$#, $0, $1, ..., "$@", "$*"

Slide 8

Slide 8 text

扩展与quote (2) ●quoting ○需要quote的字符: |&;()<> space tab ! \ ○用 \ 来 quote: \|, \& ○用 '...': 消除所有岐义,不得包含单引号(') ○用 "...": 与 '...' 类似,但允许变量替换($A),或者命令 替换 `pwd`,也允许使用\"\$\`。 ○其他: "$@", "$*", $'...'

Slide 9

Slide 9 text

流程控制 (1) ●&&, || , for, while, if, case ●&&, || ○ cmd1 || { echo "cmd1 failed"; exit 1; } ○ test -f .bashrc && cat .bashrc ● for ○ for x in *.jpg; do convert "$x" "`basename $x .jpg`.png" done ● while: ○ x=1; while test $x -lt 100; do echo $x; x=`expr $x + 1`; done

Slide 10

Slide 10 text

流程控制 (2) ●if ○if [ `id -u` = 0 ]; then echo "you are root"; fi ●case ○ case "$TERM" in xterm*|rxvt*) PROMPT_COMMAND='...' ;; screen*) PROMPT_COMMAND='....' ;; *) ;; esac

Slide 11

Slide 11 text

调试与安全 (1) ●bash -n: 仅检查语法,不执行 ●set -x: 在执行前打印实际命令(已完成所有替换) ●set -C: 防止在流重定向时覆盖文件(可放入 . bashrc, 减少误操作风险) ●mktemp, tempfile: 如何使用临时文件/临时目录 ●trap: 截获信号

Slide 12

Slide 12 text

进程查看与调试工具, gdb以外 ●ps aux: 列出所有进程 ●pstree -pAa: 进程树 ●lsof -p 12345: 列出进程打开的文件 ●lsof .bashrc: 列出文件被打开的情况 ●fuser -m /dev/sdb1: 列出分区被打开的情况 ●strace ls: 跟踪进程使用系统调用的情况 ●strace -p 12345: 跟踪已经执行的进程

Slide 13

Slide 13 text

进程查看与调试工具, gdb以外 ●ltrace: 跟踪动态库调用情况 ●valgrind: 跟踪程序内存使用情况

Slide 14

Slide 14 text

好用的命令介绍 ●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 代理工具

Slide 15

Slide 15 text

好用的命令介绍 ●dsh: 同时管理多台机器的工具 ●keychain: ssh/pgp 信任辅助工具(假定你的 ssh 信任需要输入密码, 那么如何在脚本中安全的使 用?) ●iptraf: IP 流量监视工具

Slide 16

Slide 16 text

Thanks for your attention