文件描述符stdin,stdout,stderr,重定向

Linux Shell 文件描述符stdin,stdout,stderr,重定向

系统保留的三个文件描述符分类

0 标准输入 stdin		/dev/stdin
1 标准输出 stdout 	/dev/stdout
2 标准错误 stderr	/dev/stderr

另外,当一个用户进程被创建的时候,系统会自动为该进程创建三个文件描述符0,1,2,对应的就是 stdin, stdout, stderr。当进程结束后,进程编号对应的目录将被清理。

ps -ef |grep php // 找到要查看的进程号,比如 9876
cd /proc/9876/fd
ll

在这里插入图片描述
pts/0 表示会话编号,以及输入和输出在那个会话上展示。

stdout 和 stderr 都是输出到屏幕,他们的区别在于 stdout是有缓冲的,而stderr是无缓冲的,会直接输出。

对文件描述符进行重定位(重定位运算符)

>  替换原有内容
>> 内容追加到末尾
重定位运算符 ">" ">>" 的默认参数为标准输出 stdout ,即 1 ;也就是说 >>> 默认只接收 stdout 。
所以 ">" 等价于 "1>"; ">>" 等价于 "1>>",也就是说 ls > out.log 就是 ls 1> out.log 
注意 1和>之间不能有空格,使用数字来重定向都不能有空格。

解释:
(0)、何为标准输入和标砖输出

标准输入: /dev/stdin 文件里面的数据
标准输出: /dev/stdout 文件里面的数据

(1)、当我们输入“输出指令”,例如 ls, echo 等返回的信息归为stdout;

比如:
ls > out.log
cat out.log
有内容

比如:
ls + > out2.log
ls: 无法访问+: 没有那个文件或目录
cat out2.log
空的,为什么呢?那显然返回的内容不是stdout,而是stderr,我们可以使用 $? 获取最后一条命令执行的返回值,
当返回值为零代表命令执行成功。
ls + > out2.log
echo $?
2
那么我们可不可以把标准错误重定向到标准输出呢,答案是可以的,2>&1 一般写在后面,表示如果出错了就重定向,
作为一种补救措施,毕竟谁也不能预知错误。
ls + > out3.log 2>&1
cat out3.log
ls: 无法访问+: 没有那个文件或目录

或者使用 &>
ls + &> out3.log

(2)、可以同时重定向stdout与stderr到指定的文件

cat out*.log 2>stderr.txt 1>stdout.txt

(3)、将stderr/stdout重定向到无底洞 /dev/null

ls + > /dev/null 2>&1
如果命令执行成功则将 stdout 定向到 /dev/null ,如果执行失败,则将 stderr 定向到 stdout 然后 
stdout 定向到 /dev/null
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Linux中,标准输入(stdin)、标准输出(stdout)和标准错误(stderr)是预定义的文件描述符,它们分别是0、1和2。如果我们需要重定向这些文件描述符,可以使用以下命令: ``` command < input_file.txt # 将文件input_file.txt中的内容作为标准输入 command > output_file.txt # 将标准输出写入文件output_file.txt中 command 2> error_file.txt # 将标准错误输出写入文件error_file.txt中 ``` 如果需要恢复这些文件描述符到原始状态,我们可以使用dup2()函数。它可以将一个文件描述符复制到另一个文件描述符的位置上,从而实现重定向的撤销。以下是一个示例代码: ```c #include <stdio.h> #include <unistd.h> #include <fcntl.h> int main() { int fd_in = open("input_file.txt", O_RDONLY); int fd_out = open("output_file.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666); int fd_err = open("error_file.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666); // 重定向标准输入、输出和错误输出 dup2(fd_in, STDIN_FILENO); dup2(fd_out, STDOUT_FILENO); dup2(fd_err, STDERR_FILENO); // 执行一些需要重定向的代码 printf("Hello, world!\n"); fprintf(stderr, "This is an error message.\n"); // 恢复标准输入、输出和错误输出 dup2(STDIN_FILENO, fd_in); dup2(STDOUT_FILENO, fd_out); dup2(STDERR_FILENO, fd_err); // 关闭文件描述符 close(fd_in); close(fd_out); close(fd_err); return 0; } ``` 在上面的代码中,我们首先打开三个文件描述符,并将它们分别复制到标准输入、输出和错误输出的位置上。然后我们执行一些需要重定向的代码,最后使用dup2()函数将文件描述符恢复到原始状态。最后关闭文件描述符,释放资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值