1.5.8. 典型的顺序命令和 shell 重定向

让我们试着记住下面 Shell 命令里部分命令行所使用的命令习语。

表 1.22. Shell 命令常见用法

命令常见用法说明
command &在子 shell 的后台 中执行 command
command1 | command2通过管道command1 的标准输出作为 command2 的标准输入(并行执行)
command1 2>&1 | command2通过管道command1 的标准输出和标准错误作为 command2 的标准输入(并行执行)
command1 ; command2顺序执行 command1command2
command1 && command2执行 command1;如果成功,按顺序执行 command2(如果 command1 command2 都执行成功了,返回 success )
command1 || command2执行 command1;如果不成功,按顺序执行 command2(如果 command1 command2 执行成功,返回 success )
command > foocommand 的标准输出重定向到文件 foo(覆盖)
command 2> foocommand 的标准错误重定向到文件 foo(覆盖)
command >> foocommand 的标准输出重定向到文件 foo(附加)
command 2>> foocommand 的标准错误重定向到文件 foo(附加)
command > foo 2>&1command 的标准输出和标准错误重定向到文件 foo
command < foocommand 的标准输入重定向到文件 foo
command << delimitercommand 的标准输入重定向到下面的命令行,直到遇到“delimiter”(here document)
command <<- delimitercommand 的标准输入重定向到下面的命令行,直到遇到“delimiter”(here document,命令行中开头的制表符会被忽略)

Debian 系统是一个多任务的操作系统。后台任务让用户能够在一个 shell 中执行多个程序。后台进程的管理涉及 shell 的内建命令:jobsfgbgkill。请阅读 bash(1) 中的章节:“SIGNALS”、“JOB CONTROL” 和 “builtins(1)”。

尝试下列例子

  1. $ </etc/motd pager
  1. $ pager </etc/motd
  1. $ pager /etc/motd
  1. $ cat /etc/motd | pager

尽管4个 shell 重定向的例子都会显示相同的结果,但最后一个例子毫无意义地运行了额外的 cat 命令浪费了资源。

shell 允许你使用 exec 通过任意一个文件描述符来打开文件。

  1. $ echo Hello >foo
  2. $ exec 3<foo 4>bar # 打开文件
  3. $ cat <&3 >&4 # 标准输入重定向到 3, 标准输出重定向到 4
  4. $ exec 3<&- 4>&- # 关闭文件
  5. $ cat bar
  6. Hello

预定义的文件描述符0-2。

表 1.23. 预定义的文件描述符

设备说明文件描述符
stdin标准输入0
stdout标准输出1
stderr标准错误2