如何理解Linux shell中的“2>&1”

这篇具有很好参考价值的文章主要介绍了如何理解Linux shell中的“2>&1”。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

有时候我们常看到类似这样的脚本调用:

./test.sh  > log.txt 2>&1

这里的2>&1是什么意思?该如何理解?
先说结论:上面的调用表明将./test.sh的输出重定向到log.txt文件中,同时将标准错误也重定向到log.txt文件中。

有何妙用

(如果已经明白是什么作用,可跳过此小节)
上面到底是什么意思呢?我们来看下面的例子,假如有脚本test.sh:

#!/bin/bash
date         #打印当前时间
while true   #死循环
do
    #每隔2秒打印一次
    sleep 2
    whatthis    #不存在的命令
    echo -e "std output"
done

脚本中先打印当前日期,然后每隔2秒执行whatthis并打印一段字符。由于系统中不存在whatthis命令,因此执行会报错。
假如我们想保存该脚本的打印结果,只需将test.sh的结果重定向到log.txt中即可:

./test.sh > log.txt

执行结果如下:

ubuntu$ ./test.sh >log.txt
./test.sh: 行 7: whatthis: 未找到命令

我们明明将打印内容重定向到log.txt中了,但是这条错误信息却没有重定向到log.txt中。如果你是使用程序调用该脚本,当查看脚本日志的时候,将会完全看不到这条错误信息。而使用下面的方式则会将出错信息也重定向到log.txt中:

./test.sh  > log.txt 2>&1

以这样的方式调用脚本,可以很好的将错误信息保存,帮助我们定位问题

如何理解

每个程序在运行后,都会至少打开三个文件描述符,分别是0:标准输入;1:标准输出;2:标准错误。
例如,对于前面的test.sh脚本,我们通过下面的步骤看到它至少打开了三个文件描述符:

./test.sh    #运行脚本
ps -ef|grep test.sh  #重新打开命令串口,使用ps命令找到test.sh的pid
hyb       5270  4514  0 19:20 pts/7    00:00:00 /bin/bash ./test.sh
hyb       5315  5282  0 19:20 pts/11   00:00:00 grep --color=auto test.sh

可以看到test.sh的pid为5270,进入到相关fd目录:

cd /proc/5270/fd   #进程5270所有打开的文件描述符信息都在此
ls -l              #列出目录下的内容
 0 -> /dev/pts/7
 1 -> /dev/pts/7
 2 -> /dev/pts/7
 255 -> /home/hyb/workspaces/shell/test.sh

可以看到,test.sh打开了0,1,2三个文件描述符。同样的,如果有兴趣,也可以查看其他运行进程的文件描述符打开情况,除非关闭了否则都会有这三个文件描述符。

那么现在就容易理解前面的疑问了,2>&1表明将文件描述2(标准错误输出)的内容重定向到文件描述符1(标准输出),为什么1前面需要&?当没有&时,1会被认为是一个普通的文件,有&表示重定向的目标不是一个文件,而是一个文件描述符。在前面我们知道,test.sh >log.txt又将文件描述符1的内容重定向到了文件log.txt,那么最终标准错误也会重定向到log.txt。我们同样通过前面的方法,可以看到test.sh进程的文件描述符情况如下:

 0 -> /dev/pts/7
 1 -> /home/hyb/workspaces/shell/log.txt
 2 -> /home/hyb/workspaces/shell/log.txt
 255 -> /home/hyb/workspaces/shell/test.sh

我们可以很明显地看到,文件描述符1和2都指向了log.txt文件,也就得到了我们最终想要的效果:将标准错误输出重定向到文件中
它们还有两种等价写法:

./test.sh  >& log.txt
./test.sh  &> log.txt

总结

我们总结一下前面的内容:

  • 程序运行后会打开三个文件描述符,分别是标准输入,标准输出和标准错误输出。
  • 在调用脚本时,可使用2>&1来将标准错误输出重定向。
  • 只需要查看脚本的错误时,可将标准输出重定向到文件,而标准错误会打印在控制台,便于查看。
  • >>log.txt会将重定向内容追加到log.txt文件末尾。
  • 通过查看/proc/进程id/fd下的内容,可了解进程打开的文件描述符信息。

思考

下面的调用会将标准错误输出重定向到文件中吗?为什么?文章来源地址https://www.toymoban.com/news/detail-467288.html

./test.sh 2>&1 >log.txt 

到了这里,关于如何理解Linux shell中的“2>&1”的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • M330左键有时候按下没反应的解决 - 换微动

    罗技M330鼠标左键有时候按下没反应,原因是微动老了要换新的了。 1、电烙铁/锡条(最主要的是这两个,其他可以不需要,操作电烙铁时候一定要小心,不要碰到被烫到) 2、小号螺丝刀,给眼镜用的那种,用来拆鼠标的螺丝(共2个螺丝) 视频教程: https://www.bilibili.com/vi

    2024年02月09日
    浏览(41)
  • 在Android Studio导入一个项目之后,通常需要下载Gradle的相应版本,但是AS的自动下载很慢,有时候甚至会失败。会出现类似Error:connect time out等错误...

    用Android Studio导入一个项目时,用Gradle构建过程中报错误,估计是下载gradle.zip文件时访问不到,应该是被墙了,网速太慢,下载不了外网资源。错误有如下情况:1、加载过慢2、下载超时3、下载失败 解决方法如下: 1、下载对应的gradle版本 在Project的视图下,找到gradle,里面的

    2024年02月03日
    浏览(62)
  • 如何理解Linux shell中的“2>&1”

    有时候我们常看到类似这样的脚本调用: 这里的21是什么意思?该如何理解? 先说结论:上面的调用表明将./test.sh的输出重定向到log.txt文件中,同时将标准错误也重定向到log.txt文件中。 (如果已经明白是什么作用,可跳过此小节) 上面到底是什么意思呢?我们来看下面的

    2024年02月07日
    浏览(10)
  • 从零开始理解Linux中断架构(1)-前言

    前言         前段时间在转行手撸WIFI路由器,搞wifi路由器需要理解网络驱动程序,以太网卡驱动程序,无线WIFI驱动程序,而网卡驱动的关键路径就在中断程序中,需要了解NIC设备驱动程序如何收发数据,为了彻底的知道数据包是如何二层传递上来的,又需要了解一点Lin

    2024年02月09日
    浏览(44)
  • 密码登录虽安全,但有时很麻烦!如何禁用或删除Windows 11中的密码登录

    如果你想在Windows 11上自动登录,在本指南中,我们将向你展示如何删除你的帐户密码。 在Windows 11上,你可以至少通过三种方式从帐户中删除登录密码。在你的帐户上使用密码有助于保护你的计算机和文件免受来自internet或本地的未经授权的访问。然而,在某些情况下,密码

    2024年02月08日
    浏览(34)
  • 考验大家指针功底的时候到了:请问如何理解 (int*)1 + 1 ?

     来,猜猜看,这里的执行结果是什么? 这是今天课上的一道理解题,给大家一点点思考时间。 (心里有答案了再往下滑哦)  5 4 3 2 1 . 答案是 , 报warning! 因为%p才是用来输出地址的哈哈。 不过如果忽略warning呢? 那么最终答案是:5  为什么是 5? 1 + 1 = 5? 哈哈别急,让

    2024年02月01日
    浏览(27)
  • 二、Linux入门| shell运行原理及Linux权限的理解

    centos7的安装方式 1、源码安装(较复杂) 2、rpm包安装(较复杂,未解决依赖关系) 3、yum安装(不用编译源码,不用解决软件的依赖关系,门槛较低) 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 但是这样太麻烦了,于是有些人把一

    2024年02月03日
    浏览(27)
  • 【Linux】Linux进程控制 --- 进程创建、终止、等待、替换、shell派生子进程的理解…

    柴犬: 你好啊,屏幕前的大帅哥or大美女,和我一起享受美好的今天叭😃😃😃 1. 在调用fork函数之后, 当执行的程序代码转移到内核中的fork代码后 ,内核需要分配 新的内存块 和 内核数据结构 给子进程, 内核数据结构包括PCB、mm_struct和页表,然后构建起映射关系 ,同时

    2024年01月16日
    浏览(46)
  • 【Linux】Linux环境变量的理解 --- 命令行参数、shell子进程、环境变量、本地变量…

    加油布鲁斯,你能行的! 1. 我们平常所用的Linux指令其实也是可执行程序,和我们自己写的二进制程序没什么两样,那么为什么在执行自己的程序的时候需要加上./,而执行这些系统提供的指令(可执行程序),不需要加上./呢? 2. 要执行一个程序或者指令,必须先找到这个

    2024年01月16日
    浏览(42)
  • Linux中的Shell编程

    为什么要学习Shell编程? 1.Linux运维工程师在进行服务器集群管理时,需要编写Shell程序来进行服务器管理。 2.对于JavaEE和Python程序员来说,工作的需要,你的老大会要求你编写一些Shell脚本进行程序或者是服务器的维护,比如编写一个定时备份数据库的脚本。 3.对于大数据程

    2024年02月06日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包