重定向是Linux下的一大利器,无论是在日常的运维过程中,还是开发调试工作中,都或多或少的会用到重定向。

所谓重定向,就是将进程的句柄指向别的文件,这里的文件可能是真的文件,也可以是设备。反正,linux下,也践行了Unix家族的一切皆文件思想

我们比较熟悉的是标准输入和标准输出。

在shell命令提示符下,当我们执行一个命令时,输出结果就在控制台屏幕上显示了。当需要输入时,也只需要在控制台屏幕上输入即可。

另外,我们也熟悉,标准输入的句柄是0,标准输出的句柄是1,错误输出的句柄是2。这是为啥呢?

因为我们的进程都是从原始进程继承下来的,比如通过fork调用。那么,父进程打开的句柄,就会被子进程也继承了。

如果原始祖先进程打开了0、1、2句柄资源作为标准输入输出,那么子进程继承这些资源,也就默认有了这些句柄。

可以通过下面的命令,查看一个进程的输入输出句柄:
ls /proc/$$/fd -l

这里的$$指代了当前进程。如果我们知道进程的pid,那么可以用pid代替

我们在一个终端里输入sleep 10
然后在另一个终端里看看这个sleep进程的标准输入输出

当然,标准输入输出也不是固定不变的,进程可以指定自己的标准输入输出
我们找一个系统启动的进程,测试看看,效果如下:

可以看到,标准输入被定向到null设备,也就是该进程不需要输入
标准和错误输出被定向到了socket

这就是输入输出的重定向。

当然,我们最常见的重定向是通过 >  < 这两个符号,开口向左的是输出重定向,另一个是输入重定向。
另外,还有>> <<,开口向左的仍然是输出。差别在于,这种方式有追加的意思。
对于输出而言,如果重定向的文件存在的话,新的输出追加到文件尾部。单个符号的情况就是直接覆盖方式。
对于输入而言,可以指定一个分解符,遇到分解符停止输入。也是有点追加的意思了。

举个简单例子,我们通过如下方式,将一个命令的输出重定向到文件中
ls > /tmp/lsout.txt

从上图可以看到,ls的输出并没有到控制台,而是到了文件中。另外,我们可看到追加的方式,确实将新的内容追加到文件尾部了。

同样,我们还是以前面的sleep做个试验,将其进程的输出重定向到文件中,然后看看进程的句柄是什么情况

可以看到,标准输出指向了文件。重定向成功。

到此,我们简单了解了重定向。

下面,我们来看看,如果解决标题中的问题,就是如何在shell中重定向输出。

先简单说说需求。我有一个脚本,它是被别的程序拉起的,所以其调试输出信息就是拉起它的那个程序

比如,我们在调试一个硬件设备时候,启动的rcS脚本输出都基本是在串口中。

当我们通过网络登录设备调试时,就不能很好的观察这些被指向到串口输出的信息。那么,该如何解决这个问题呢?

一种方法就是如标题中所述的,如果我们能够将输出重定向到文件中,那么就有效保留了历史记录。

对于一个独立的程序或shell来讲,方法比较简单,使用前面的 > 就可以解决。

但是,如果这个程序和shell的启动不是由我们自己控制的,那么该如何处理这个问题?

对于可执行程序而言,这稍微复杂点,网上有一个工具,感兴趣的读者可以去试试

https://github.com/jerome-pouiller/reredirect

基本思路就是通过ptrace系统调用控制要重定向的进程,然后通过dup修改句柄
这个不是本文要关注的。

我们来看,如果被拉起的是一个脚本,那如何解决?(shell的特点是,你可以编辑它,所以,没有可执行文件那么复杂。)

答案就是内置exec命令。

送你飞刀一把

exec命令有两个用处:
一个是接管shell,就是exec调用中,其后跟的命令会被执行,shell中剩余部分不再执行。exec中带的命令执行结束后,shell也就结束了。

另一个就是可以改变shell的输出。比如,我们要把设备启动的rcS脚本执行情况输出到tmp文件系统下的某个文件,则只需要在tmp挂载成功后(mount -n -t ramfs none /tmp) 添加如下一行内容:

exec > /tmp/rcS.txt 2>&1

这样,shell之后的所有输出都会重定向到 /tmp/rcS.txt这个文件。

其实仔细想想,这里的exec没有带具体的命令,所以还是shell本身。

另外,这里的2 1就是前面提到的标准错误输出和标准输出。意思是将shell后面的输出重定向到 /tmp/rcS.txt文件中,包括标准输出和标准错误输出。

如果不加后的2>&1的话,只是将标准输出重定向。

注意这里的写法,&在1的前面。其实很好记,如果写在后面,就跟后台执行程序方式混希了,所以需要写在前面,以便区分。

好了,如果你也有这类需求,现在就可以用这个方法试试看了。

GOOD LUCK.

如果你觉得本文有用的话,就点个赞吧!

小李飞刀之如何重定向脚本输出相关推荐

  1. Linux shell脚本输出日志的方法和案例

    Linux shell脚本输出日志 #### log_correct函数打印正确的输出到日志文件 function log_correct () {DATE=`date "+%Y-%m-%d ...

  2. 输入重定向,输出重定向,管道相关内容及实现方法

    近期,通过实现shell了解了输入重定向,输出重定向,管道- 用自己的话总结定义: 输入重定向:把<右边的文件的内容输入到<左边的命令中. 输出重定向:把运行>左边命令得出的结果输入 ...

  3. linux shell数据重定向(输入重定向与输出重定向)详细分析

    转载自: linux shell数据重定向(输入重定向与输出重定向)详细分析 - 程默 - 博客园 http://www.cnblogs.com/chengmo/archive/2010/10/20/ ...

  4. linux重定向进程输出到文件删除,Linux文件编辑器vim输出输入重定向、管道以及进程(示例代码)...

    合抱之木,生于毫末:九层之台,起于累土:千里之行,始于足下.正因基础的重要性,才又撸起了linux. linux编辑工具: VI VIM EMACS vim 是vi的升级版本,它不仅兼容vi的所有指令 ...

  5. 脚本输出当前 “yyyy-MM-dd WeakDay Festval”

    ylbtech-JavaScript: 脚本输出当前 "yyyy-MM-dd WeakDay Festval" 脚本输出当前 "yyyy-MM-dd WeakDay Fe ...

  6. jenkins 手动执行_想知道如何用Jenkins自动执行Python脚本输出测试报告?

    前言在用python做自动化测试时,我们写好代码,然后需要执行才能得到测试报告,这时我们可以通过 Jenkins 来进一步完成自动化工作.借助Jenkins,我们可以结合 Git/SVN 自动拉取代码 ...

  7. Asp: 解决脚本输出网页出现乱码情况

    很久没碰asp,都有点生疏了,唉... 今天写一个小程序,发现网页静态部分输出不会乱码,asp脚本部分输出在360浏览器上会显示乱码,但在firefox和chrome上测试却不会显示乱码,我已经在代码 ...

  8. 教你如何用shell脚本输出菱形

    教你如何用shell脚本输出菱形 通过shell脚本,我们可以在脚本中,用不同的符号,来输出一个菱形图案.虽然图案看起来输出比较容易,但是真正写起来,还是要体研究起来,我们还是可以发现,其实还是有点小 ...

  9. NAMD 中计算水分子沿某一放向的平均值 (tcl/tk 脚本输出数据, awk 求某一列平均值)

    .conf 文件里面 写入输出速度的 参数 veldcdfreq 500 run MD mv r3.veldcd r3vel.dcd vmd .psf r3vel.dcd 执行脚本 输出 veloci ...

最新文章

  1. 嬴彻CEO:自动驾驶技术只有依托量产,才有持久优势
  2. [洛谷P1268]树的重量
  3. JAVA之关于This的用法
  4. 钉钉微应用怎么进入_蓝凌携手钉钉走进越秀地产,零距离热聊企业数字化转型...
  5. python中dataframe合并列名日期到季度_python – 如何在特定日期范围内的pandas列DataFrame中对某些值求和...
  6. Springboot2 搭建 高性能Websocket服务器
  7. mach-o hook
  8. python 字符类型
  9. Java去除字符串最前面一个字符和最后面一个字符
  10. MySQL中将多行查询结果合并为一行展示SQL语句书写
  11. 在eclipse中使用git创建本地库,以及托管项目到GitHub超详细教程
  12. svpwm矢量控制电机相电压波形_SVPWM调制中的6个非零基础电压矢量的幅值到底是Udc还是2/3Udc ? 电压利用率为什么是1?...
  13. 小甲鱼python课后习题及答案
  14. 搭建vue并且实现360和谷歌浏览器对office(ntko)在线编辑工具的集成
  15. 新浪邮箱界面登录按钮效果制作
  16. 准备搭建一个服务器,使用云服务器和个人电脑哪个好?
  17. 阿里云、腾讯云、百度云、京东云、华为云、他们之间的不同之处?
  18. 单片机I/O常用的驱动与隔离电路设计
  19. 嵌入式操作系统--篮球记分计时系统
  20. 演算法 - 分治法(Divide-and-Conquer)

热门文章

  1. windeployqt打包Qt应用程序
  2. 银行客户用户画像_技术分享 | 基于数据中台的银行客户画像体系构建
  3. 基础shell脚本练习
  4. 一、容器(Containers)
  5. python进程池的使用
  6. Uni-app + uview 个人信息页 修改用户昵称、性别、个性签名
  7. 关于箱线/形图的上下边缘以及异常值的确定
  8. c语言图像剪影代码,信息系C语言社团活动剪影-南京商业学校.PDF
  9. 后台守候穿越火线进程
  10. Lightroom Classic 2021 for mac (lrc 2021)