Shell脚本命令扩展
文章目录
- 一、标准文件描述符
- 1. 标准输入(0,stdin)
- 2. 标准输出(1,stdout)
- 3. 标准错误(2,stderr)
- 特殊用法:丢弃输出
- 二、 命令退出状态码
- 如何查看退出状态码
- 总结
一、标准文件描述符
在 Linux/Unix 系统中,文件描述符(File Descriptor) 是一个非负整数,用于标识进程正在操作的文件或 I/O 流。标准文件描述符是系统预定义的 3 个基础描述符,分别对应程序运行时默认打开的 3 种 I/O 流:
文件描述符 名称 缩写 默认对应设备作用
0 标准输入 stdin 键盘 接收用户输入的数据
1 标准输出 stdout 终端(屏幕) 输出程序的正常结果
2 标准错误 stderr 终端(屏幕) 输出程序的错误信息
1. 标准输入(0,stdin)
程序从标准输入读取数据,默认是键盘输入,可通过 < 符号重定向到文件。
# 从键盘读取输入(默认行为)
read -p "请输入你的名字: " name
echo "你好,$name"# 从文件读取输入(重定向 stdin)
# 假设文件 input.txt 内容为 "Alice"
read name < input.txt
echo "从文件读取到的名字: $name" # 输出:从文件读取到的名字: Alice
2. 标准输出(1,stdout)
程序输出正常结果,默认显示在屏幕,可通过 > 或 1> 符号重定向到文件。
# 输出到屏幕(默认行为)
echo "这是正常输出" # 直接显示在屏幕# 重定向到文件(1> 可简写为 >)
echo "保存到文件的内容" 1> output.txt # 内容写入 output.txt
ls -l > file_list.txt # 将 ls 命令的结果保存到文件
3. 标准错误(2,stderr)
程序输出错误信息,默认显示在屏幕,需通过 2> 符号单独重定向(与 stdout 区分)。
# 错误信息默认显示在屏幕
ls non_existent_file # 输出:ls: 无法访问 'non_existent_file': 没有那个文件或目录# 重定向错误信息到文件
ls non_existent_file 2> error.log # 错误信息写入 error.log,屏幕无输出# 同时重定向 stdout 和 stderr(分别到不同文件)
command > output.log 2> error.log# 同时重定向 stdout 和 stderr 到同一个文件
command > all_output.log 2>&1 # 将 stderr 合并到 stdout,一起写入文件
command > all_output.log 2>&1
这条命令如果command正常执行的话为标准输出1,会正常写入到log文件中,2>&1的作用是将当command输出错误时为2,按理说应该不写入到log中而是直接打印在终端中,但是2>&1可以使2走标准输出的路径通道,所以会和1一起输入到log中,也就是说不管这个命令是正确执行还是报错,都会将执行后的结果或者错误报告写到log中。
特殊用法:丢弃输出
如果需要忽略某个流的输出(如屏蔽错误信息),可重定向到 /dev/null(系统的 “黑洞” 设备):
# 忽略错误信息
rm non_existent_file 2> /dev/null# 忽略所有输出(stdout 和 stderr)
command > /dev/null 2>&1
二、 命令退出状态码
在 Linux/Unix 系统中,命令退出状态码(Exit Status Code) 是命令执行完毕后返回给系统的一个整数,用于表示命令的执行结果(成功、失败或特定状态)。
核心规则
- 状态码为 0:表示命令执行成功
- 状态码为 非 0(1~255):表示命令执行失败(不同非 0 值可能对应不同错误原因)
如何查看退出状态码
# 执行一个成功的命令
ls ~
echo $? # 输出 0(表示成功)# 执行一个失败的命令
ls /不存在的目录
echo $? # 输出非 0(如 2,表示失败)
注意:当使用 ps 结合 grep 过滤但没有找到匹配数据时(即使正确执行了),grep 命令会返回状态码 1。这是 grep 命令的特性:
# 场景1:查找存在的进程(如 bash)
ps aux | grep "bash"
echo $? # 输出 0(找到匹配内容)# 场景2:查找不存在的进程(如 non_existent_process)
ps aux | grep "non_existent_process"
echo $? # 输出 1(未找到匹配内容)# 场景3:grep 发生错误(如无效选项)
ps aux | grep --invalid-option
echo $? # 输出 2(命令错误)
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。