1.5.8. 典型的顺序命令和 shell 重定向
让我们试着记住下面 Shell 命令里部分命令行所使用的命令习语。
表 1.22. Shell 命令常见用法
命令常见用法 | 说明 |
---|---|
command & | 在子 shell 的后台 中执行 command |
command1 | command2 | 通过管道将 command1 的标准输出作为 command2 的标准输入(并行执行) |
command1 2>&1 | command2 | 通过管道将 command1 的标准输出和标准错误作为 command2 的标准输入(并行执行) |
command1 ; command2 | 按顺序执行 command1 和 command2 |
command1 && command2 | 执行 command1 ;如果成功,按顺序执行 command2 (如果 command1 和 command2 都执行成功了,返回 success ) |
command1 || command2 | 执行 command1 ;如果不成功,按顺序执行 command2 (如果 command1 或 command2 执行成功,返回 success ) |
command > foo | 将 command 的标准输出重定向到文件 foo (覆盖) |
command 2> foo | 将 command 的标准错误重定向到文件 foo (覆盖) |
command >> foo | 将 command 的标准输出重定向到文件 foo (附加) |
command 2>> foo | 将 command 的标准错误重定向到文件 foo (附加) |
command > foo 2>&1 | 将 command 的标准输出和标准错误重定向到文件 foo |
command < foo | 将 command 的标准输入重定向到文件 foo |
command << delimiter | 将 command 的标准输入重定向到下面的命令行,直到遇到“delimiter ”(here document) |
command <<- delimiter | 将 command 的标准输入重定向到下面的命令行,直到遇到“delimiter ”(here document,命令行中开头的制表符会被忽略) |
Debian 系统是一个多任务的操作系统。后台任务让用户能够在一个 shell 中执行多个程序。后台进程的管理涉及 shell 的内建命令:jobs
、fg
、bg
和 kill
。请阅读 bash(1) 中的章节:“SIGNALS”、“JOB CONTROL” 和 “builtins(1)”。
尝试下列例子
$ </etc/motd pager
$ pager </etc/motd
$ pager /etc/motd
$ cat /etc/motd | pager
尽管4个 shell 重定向的例子都会显示相同的结果,但最后一个例子毫无意义地运行了额外的 cat
命令浪费了资源。
shell 允许你使用 exec
通过任意一个文件描述符来打开文件。
$ echo Hello >foo
$ exec 3<foo 4>bar # 打开文件
$ cat <&3 >&4 # 标准输入重定向到 3, 标准输出重定向到 4
$ exec 3<&- 4>&- # 关闭文件
$ cat bar
Hello
预定义的文件描述符0-2。
表 1.23. 预定义的文件描述符
设备 | 说明 | 文件描述符 |
---|---|---|
stdin | 标准输入 | 0 |
stdout | 标准输出 | 1 |
stderr | 标准错误 | 2 |