shell中2>&1的含义

在做实验的过程中,经常会看到shell脚本里存在 2>&1 的指令组合,有点懵逼,在此记录一下。

0 | 1 | 2

这三个数字是linux文件描述符。

数字含义
0stdin
1stdout
2stderr

12 都是输出到屏幕设备上。

我们平时使用的:

echo "Hello World" > test.log

等价于:

echo "Hello World" 1> test.log

注意 1> 是连在一块的。如果分开,那么写入文件的就是 Hello World 1

2>&1

将标准错误输出重定向到标准输出。

示例

import sys
sys.stdout.write("this is stdout\n")
sys.stderr.write("this is stderr\n")
python test.py > test.log 2>&1

表示将标准错误输出重定向到标准输出,标准输出重定向到 test.log 文件中。

在程序执行过程中,我们希望输出保存到文件中,如果有错误的信息也希保存到文件中,那么就使用上面的命令。

  • python test.py > test.log 2>1 : 那么标准输出将重定向到 test.log ,而错误将输出到名字为 1 的文件中。这里的 & 可以理解为 1 的引用
  • python test.py > test.log 2 >&1 : 那么标准输出将重定向到 test.log ,而错误将输出到屏幕上
  • python test.py > test.log 2>& 1 : 等价于 python test.py > test.log 2>&1
  • python test.py 1> test.log 2> test.log : 会存在如下两个问题:
    • stdout 会覆盖 stderr
    • test.log 会被打开两次,IO效率低下

2>&1 为什么放在末尾?

python test.py > test.log 2>&1 从左往右来看 stdin 定向到 test.log,然后 stderr 定向到 stdin,等于说 stderr 也输入到了 test.log 中。

如果放在中间:python test.py 2>&1 >test.logstderr 定向到 stdin,但此时 stdin 指向的是屏幕,所以 stderr 会输出到屏幕。执行到 >test.log 的时候,stdin 定向到 test.log。所以 test.log 文件里只有 this is stdout

简写

python test.py > test.log 2>&1

可以简写成:

python test.py >& test.log

参考自

Shell 中的文件描述符重定向是控制输入和输出的重要机制,其中 `2>&1` 是一个常见的用例,用于将标准错误(文件描述符 2)重定向到与标准输出(文件描述符 1)相同的位置。 ### 文件描述符的基本概念 在 Shell 中,默认有三个文件描述符: - **0**:标准输入(stdin) - **1**:标准输出(stdout) - **2**:标准错误(stderr) 通常情况下,命令的标准输出和标准错误都会打印到终端。通过重定向,可以将它们发送到文件、设备或其他命令中。 ### `2>&1` 的含义 `2>&1` 表示将标准错误(文件描述符 2)重定向到当前标准输出(文件描述符 1)所指向的位置。这意味着标准错误的内容会与标准输出的内容一起被处理。 例如,在命令 `command > file 2>&1` 中,标准输出先被重定向到 `file`,然后标准错误也被重定向到同一文件。这样,`file` 中将同时包含命令的正常输出和错误信息[^1]。 ### 使用方法 #### 基本语法 ```bash command > file 2>&1 ``` 上述命令的执行顺序如下: 1. `> file` 将标准输出(文件描述符 1)重定向到文件 `file`。 2. `2>&1` 将标准错误(文件描述符 2)复制到文件描述符 1 所指向的位置,即同样写入 `file`。 #### 注意顺序 如果命令写作 `command 2>&1 > file`,则行为不同。在这种情况下,`2>&1` 先执行,此时标准输出尚未被重定向,因此标准错误仍然指向终端;随后 `> file` 将标准输出重定向到文件,但标准错误不会受到影响。 #### 示例代码 以下是一个实际使用 `2>&1` 的 Bash 脚本示例: ```bash #!/bin/bash # 将标准输出和标准错误都写入 output.log echo "Starting command..." > output.log 2>&1 some_command >> output.log 2>&1 ``` 在这个脚本中,所有输出(包括正常输出和错误信息)都会被追加到 `output.log` 文件中。 ### 应用场景 - **日志记录**:将程序的输出和错误统一记录到日志文件中,便于调试和监控。 - **后台运行**:结合 `nohup` 或 `&` 使用时,防止输出内容丢失。 - **自动化脚本**:确保脚本运行时不会向用户终端输出无关信息。 ### 错误重定向到 `/dev/null` 如果希望忽略所有错误信息,可以将标准错误重定向到 `/dev/null`: ```bash command > /dev/null 2>&1 ``` 这表示将标准输出和标准错误都丢弃,不产生任何输出[^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值