第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 -l4.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个标准数据流:
| 流 | 编号 | 名称 | 默认来源/目标 |
|---|---|---|---|
| stdin | 0 | 标准输入 | 键盘 |
| stdout | 1 | 标准输出 | 屏幕 |
| stderr | 2 | 标准错误 | 屏幕 |
- 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 | uniq4.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.log4.8 防止重定向时覆盖文件
set -o noclobber设置后,> 不能覆盖已存在的文件,防止误操作。
需要强制覆盖时用 >|:
command >| existing_file.txt关闭该设置:
set +o noclobber4.9 将命令的输出追加到文件
command >> file.txt
command 2>> error.log
command &>> all.log追加模式,不覆盖原有内容,添加到文件末尾。
适合累积日志:
./daily_backup.sh >> backup.log 2>&14.10 将文件作为命令的输入
输入重定向
command < file.txt
sort < words.txt将文件内容作为命令的 stdin 输入。
大多数命令直接接文件名也行,但输入重定向是通用方式。
Here Document(内嵌文档)
cat << EOF
第一行内容
第二行内容
第三行内容
EOF将多行文本直接作为命令输入,脚本中常用。
4.11 小结
命令组合速查
| 符号 | 名称 | 作用 |
|---|---|---|
; | 分号 | 顺序执行,互不影响 |
&& | 逻辑与 | 前一个成功才执行后一个 |
|| | 逻辑或 | 前一个失败才执行后一个 |
| | 管道 | 前一个的输出作为后一个的输入 |
> | 输出重定向 | 覆盖写入文件 |
>> | 追加重定向 | 追加写入文件 |
< | 输入重定向 | 从文件读取输入 |
$() | 命令替换 | 将命令输出嵌入字符串 |
掌握命令组合、管道和重定向,是从”会用命令”到”精通shell”的关键一步。