第4章 组合命令

所属:第一部分 shell入门 来源:Linux命令速查手册

单个命令的能力有限,但通过组合命令,可以完成非常强大的功能。命令组合是shell强大功能的核心。


4.1 连续运行多个命令

command1; command2; command3

分号分隔,依次执行,互不影响。

  • 无论前一个命令成功还是失败,后面的都会执行
  • 按顺序从左到右执行

示例:

$ echo "开始"; sleep 2; echo "结束"
开始
(等待2秒)
结束

4.2 只有前面的命令运行成功,才运行下一个命令

command1 && command2

逻辑与(AND):只有前一个命令退出码为0(成功)时,才执行后一个。

  • 前一个失败 → 后面的不执行
  • 常用于有依赖关系的操作

示例:

# 只有配置文件检查通过,才重启服务
$ nginx -t && systemctl restart nginx
 
# 只有切换目录成功,才列出内容
$ cd /some/dir && ls -l

4.3 只有前面的命令运行失败,才运行下一个命令

command1 || command2

逻辑或(OR):只有前一个命令退出码非0(失败)时,才执行后一个。

  • 前一个成功 → 后面的不执行
  • 常用于出错时的备用方案或错误提示

示例:

# 命令失败时打印提示
$ cd /some/dir || echo "目录不存在"
 
# 尝试命令A,失败就用命令B
$ command1 || command2

组合使用 && 和 ||

command && echo "成功" || echo "失败"

类似简单的 if-else 效果。


4.4 将一个命令的输出插入到另一个命令

命令替换

echo "Today is $(date)"
echo "Today is `date`"

两种写法:

  • $(command) — 推荐,支持嵌套
  • `command` — 反引号,旧写法

先执行括号内的命令,将输出结果替换到原位置。

示例:

# 备份文件,加上日期
$ cp file.txt file.txt.$(date +%Y%m%d)
 
# 统计当前目录文件数
$ echo "当前有 $(ls | wc -l) 个文件"

4.5 理解输入/输出流

Linux程序有3个标准数据流:

编号名称默认来源/目标
stdin0标准输入键盘
stdout1标准输出屏幕
stderr2标准错误屏幕
  • stdin:程序读取的数据输入
  • stdout:程序正常输出的结果
  • stderr:程序报错或警告信息

stdout 和 stderr 是分开的,可以分别重定向到不同地方。


4.6 将一个命令的输出用作另一个命令的输入

管道(Pipe)

command1 | command2
ls -l | less

用竖线 | 连接,将左边命令的 stdout 作为右边命令的 stdin

  • 可以串联多个管道:cmd1 | cmd2 | cmd3
  • stderr 默认不通过管道

常用示例:

# 分页查看长列表
ls -la | less
 
# 统计行数
ls | wc -l
 
# 过滤进程
ps aux | grep firefox
 
# 排序并去重
cat file.txt | sort | uniq

4.7 将命令的输出重定向到文件

输出重定向

command > file.txt        # 覆盖写入stdout
command 1> file.txt       # 显式指定stdout(同上)
command 2> error.log      # 重定向stderr
command &> all.log        # 重定向所有输出(stdout+stderr)
command > all.log 2>&1    # 同上,另一种写法
  • >覆盖文件原有内容
  • 文件不存在会自动创建

示例:

# 将结果保存到文件
ls -l > filelist.txt
 
# 错误日志单独保存
command 2> errors.log
 
# 所有输出都保存
./script.sh &> output.log

4.8 防止重定向时覆盖文件

set -o noclobber

设置后,> 不能覆盖已存在的文件,防止误操作。

需要强制覆盖时用 >|

command >| existing_file.txt

关闭该设置:

set +o noclobber

4.9 将命令的输出追加到文件

command >> file.txt
command 2>> error.log
command &>> all.log

追加模式,不覆盖原有内容,添加到文件末尾。

适合累积日志:

./daily_backup.sh >> backup.log 2>&1

4.10 将文件作为命令的输入

输入重定向

command < file.txt
sort < words.txt

将文件内容作为命令的 stdin 输入。

大多数命令直接接文件名也行,但输入重定向是通用方式。

Here Document(内嵌文档)

cat << EOF
第一行内容
第二行内容
第三行内容
EOF

将多行文本直接作为命令输入,脚本中常用。


4.11 小结

命令组合速查

符号名称作用
;分号顺序执行,互不影响
&&逻辑与前一个成功才执行后一个
||逻辑或前一个失败才执行后一个
|管道前一个的输出作为后一个的输入
>输出重定向覆盖写入文件
>>追加重定向追加写入文件
<输入重定向从文件读取输入
$()命令替换将命令输出嵌入字符串

掌握命令组合、管道和重定向,是从”会用命令”到”精通shell”的关键一步。


Linux Shell 管道 重定向 命令组合 pipe redirect