最近在做项目的时候遇到的几个知识点,我觉得非常有意思,以前学Linux的时候也有接触到管道方面的,但是在应用中却基本没有遇到过。

还有Linux下的几个特殊的文件描述符,用这几个文件描述符可以做很多事情,能做什么事情决定你自己的本事了。

#Linux下的 0 1 2文件描述符

  • 1 是标准输出(stdout)

  • 2 是标准错误输出(stderr)

  • 0 是标准输入(stdin)

第一个

但是我们使用的时候,我们会把这样使用 1> 两个符号连着一起,而且呢,1和>符号之间不能有空格,有空格和没有空格就是两回事了。

如下,把标准输出结果重定向到 list.txt文件里面。

linux@ubuntu:~$ ls 1>list.txt
linux@ubuntu:~$ cat list.txt
Desktop
Documents
Downloads
examples.desktop
Music
Pictures
Public
Templates
Videos
linux@ubuntu:~$

第二个

把标准错误输出重定向到list文件里面,但是我们就简单执行ls,所以没有错误,当我们执行cat的时候,自然就是没有任何输出了。

linux@ubuntu:~$ ls 2>list.txt
Documents  examples.desktop  linux-device-driver   Pictures    Videos
Desktop  Downloads  Music     Public    Templates    vmwaretools
linux@ubuntu:~$ cat list.txt
linux@ubuntu:~$

第三个

&是不是很像取地址符号,我们往标准输入 echo 一个字符串,然后屏幕就打印了这个字符串出来。就是这么简单,就是这么讲道理。

linux@ubuntu:~$ echo "1212" >&0
1212
linux@ubuntu:~$

#简单的应用

我们在Linux下,经常用到find 这个指令,如果find的时候,如果find某些文件夹没有权限的话,就会提示一些错误。让你看到输出很恶心。比如

linux@ubuntu:~$ find /etc -iname "*.service"
find: `/etc/ssl/private': Permission denied
find: `/etc/vmware-tools/GuestProxyData/trusted': Permission denied
/etc/systemd/system/multi-user.target.wants/rsyslog.service
find: `/etc/cups/ssl': Permission denied
/etc/avahi/services/udisks.service
linux@ubuntu:~$

我们要是只想看到正确的输出,把错误的输出都扔进垃圾桶,应该怎么做呢?

linux@ubuntu:~$ find /etc -iname "*.service" 2>/dev/null
/etc/systemd/system/multi-user.target.wants/rsyslog.service
/etc/avahi/services/udisks.service
linux@ubuntu:~$

这样看起来是不是很舒服了?

免费再赠送一个例子,我们在Android设备里面经常需要find一些东西。

RK3399:/ # find / -iname "*.rc"
find: /proc/2/task/2/exe: No such file or directory
find: /proc/2/exe: No such file or directory
find: /proc/3/task/3/exe: No such file or directory
find: /proc/3/exe: No such file or directory

我们换个写法,就会发现不一样的世界

RK3399:/ # find / -iname "*.rc" 2> /dev/null
/init.recovery.mt8167.rc
/init.usb.rc
/init.environ.rc
/vendor/etc/init/muxreport.rc
/vendor/etc/init/android.hardware.audio@4.0-service-mediatek.rc

这样的输出是不是让你觉得非常爽,是的,这样的输出让我也觉得非常爽。

#/dev/null

我们在上面已经用了 /dev/null ,现在来剖析一下。

这个东东有意思,如果我们有一些输出不想看到,就重定向到这里,这个就好像一个能吸纳所有东西的无底洞一样。非常有意思。

如果我们当前没有一个文件

linux@ubuntu:~$ ls 1212.txt
ls: cannot access 1212.txt: No such file or directory
linux@ubuntu:~$

这时候就会提示没有这个文件,如果我们不想看到这个恶心的输出,可以这样做

linux@ubuntu:~$ ls 1212.txt 2>/dev/null
linux@ubuntu:~$

作用就是把 stderr 输出到 /dev/null 这个垃圾桶里面。

#2>&1

对于2>&1的理解,2就是标准错误,1是标准输出,那么这条命令不就是相当于把标准错误重定向到标准输出么?

是的。为什么是&1而不是1,这里& 符号是什么?& 符号可以理解为引用(reference)。&1 就是对标准输出的引用。「我觉得可以理解为我们C语言里面的取地址符号,拿到标准输出的地址,往地址里面灌什么,标准输出就会给你输出什么」

#后台运行指令

##nohup

nohup 指的是把命令放后台运行,并且不挂断的运行,他会把输出默认定向到文件nohup.out中。

##&

这个指令指的是在后台运行。

## 实例

我们两个指令一起使用试试

weiqifa@bsp-ubuntu1804:~/sdk$ nohup make -j128&
[1] 22928
weiqifa@bsp-ubuntu1804:~/sdk$ nohup: ignoring input and appending output to 'nohup.out'
weiqifa@bsp-ubuntu1804:~/sdk$

然后过了一下看看

weiqifa@bsp-ubuntu1804:~/em_mt8167s-9.0-sdk$ cat nohup.out
wildcard(out/target/product/em_t6230_p4mme/*-verified.*) was changed, regenerating...
[1/953] including out/soong/Android-full_em_t6230_p4mme.mk ...
[2/953] including art/Android.mk ...
[3/953] including bionic/Android.mk ...
[4/953] including bootable/recovery/Android.mk ...
[5/953] including build/make/Android.mk ...
[6/953] including ccu_tool/Android.mk ...
[7/953] including cts/Android.mk ...
weiqifa@bsp-ubuntu1804:~/em_mt8167s-9.0-sdk$

看看后台进程

weiqifa@bsp-ubuntu1804:~/sdk$ ps -ef |grep make
weiqifa  22928 22616  0 04:50 pts/6    00:00:00 make -j128
weiqifa  22930 22928  0 04:50 pts/6    00:00:00 prebuilts/build-tools/linux-x86/bin/makeparallel --ninja build/soong/soong_ui.bash --make-mode
weiqifa  22931 22930  6 04:50 pts/6    00:00:05 /home/weiqifa/em_mt8167s-9.0-sdk/out/soong_ui -j128 --make-mode
weiqifa  29017 22616  0 04:52 pts/6    00:00:00 grep --color=auto make
weiqifa@bsp-ubuntu1804:~/sdk$

##tail -f

weiqifa@bsp-ubuntu1804:~/em_mt8167s-9.0-sdk$ tail -f nohup.out
out/target/product/em_t6230_p4mme/obj/PACKAGING/systemimage_intermediates/system.img
[100% 39/39] Install system fs image: out/target/product/em_t6230_p4mme/system.img
^C
weiqifa@bsp-ubuntu1804:~/em_mt8167s-9.0-sdk$

Linux 下的0 1 2特殊文件描述符~相关推荐

  1. 嵌入式Linux系统编程学习之九基于文件描述符的文件操作

    文章目录 前言 一.文件描述符 二.打开.创建和关闭文件 三.读写文件 四.改变文件大小 五.文件定位 六.原子操作 七.进一步理解文件描述符 八.文件描述符的复制 九.文件的锁定 十.获取文件信息 ...

  2. Linux中的进程、线程和文件描述符

    说到进程,恐怕面试中最常见的问题就是线程和进程的关系了,那么先说一下答案: 在 Linux 系统中,进程和线程几乎没有区别 . Linux 中的进程就是一个数据结构,看明白就可以理解文件描述符.重定向 ...

  3. Linux操作系统~系统文件IO,什么是文件描述符fd?什么是vfs虚拟文件系统

    目录 1.open() (1).第二个参数flags-通过比特位传多组标记 2.文件描述符fd(open函数的返回值) (1).fd的本质 (2).vfs-虚拟文件系统(一切皆文件) (3).调用re ...

  4. 文件描述符与文件句柄

    在我们日常编程中经常会遇到文件描述符(file descriptor)和文件句柄(file handler)这两个概念,特别是需要开发跨平台(跨windows和linux)项目的时候会被这两个概念搞得 ...

  5. Linux下的文件描述符

    引文 在 Linux 的世界里,一切设备皆文件.对文件的操作都是通过文件描述符(fd)来进行的. Linux 中有7种文件类型: 文件类型 文件类型描述 符号 普通文件 最常使用的一类文件,其特点是不 ...

  6. Linux系统学习笔记:文件描述符标志

    文件描述符标志的概念 文件描述符标志(目前就只有一个close-on-exec): 它仅仅是一个标志,当进程fork一个子进程的时候,在子进程中调用了exec函数时就用到了这个标志.意义是执行exec ...

  7. [转帖]linux文件描述符文件/etc/security/limits.conf

    linux文件描述符文件/etc/security/limits.conf https://blog.csdn.net/fanren224/article/details/79971359 需要多学习 ...

  8. Linux 进程间传递文件描述符

    文章目录 文件描述符 文件数据结构 共享文件 UNIX域socket实现传递文件描述符 进程间传递打开的文件描述符,并不是传递文件描述符的值.先说一下文件描述符. 文件描述符 对内核来说,所有打开的文 ...

  9. Linux网络编程(六)-高并发服务器03-I/O多路复用03:epoll【红黑树;根节点为监听节点】【无宏FD_SETSIZE限制;不需每次都将要监听的文件描述符从应用层拷贝到内核;不需遍历树】

    一.epoll概述 epoll的本质是一个[红黑树].监听结点为根节点. 大量并发,少量活跃效率高. epoll是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并 ...

最新文章

  1. ubuntu下修改文件权限
  2. Windows上创建文件夹链接
  3. Gym 100431E Word Cover 题解:KMP上跑dp
  4. Python多线程详解
  5. XML Schema 基本结构
  6. 自制“低奢内”CSS3登入表单,包含JS验证,请别嫌弃哦。
  7. 快手基于 Apache Flink 的优化实践
  8. dma和通道的区别_STM32 定时器触发 ADC 多通道采集,DMA搬运至内存
  9. springboot使用JSR303对数据进行校验
  10. Griffon 1.1 发布,Groovy 开发框架
  11. 二、Linux常用命令——文件处理命令
  12. ChartDirector画2D,3D图,MFC画图
  13. Java网络编程之InetAddress类详解,URL和URI的区别,URLDecoder和URLEncoder,IPv6和IPv4区别,IPv6的三种表示方法
  14. JavaScript基础视频教程总结(011-020章)
  15. LCD1602的四线驱动
  16. java分布式特点_java分布式架构是什么?分布式架构的优缺点有哪些?
  17. 钉钉小程序内嵌web网页
  18. 多种汉语方言语音落地应用,微软智能语音解锁更多交互场景
  19. 知名学者,全职加盟C9高校!
  20. 微信小程序app.json全局配置项

热门文章

  1. 教程-Delphi第三方控件安装卸载指南
  2. Javascript中call函数和apply函数的使用
  3. 流媒体服务器搭建实例——可实现录音,录像功能
  4. 两招让陌生网络访问者现出原形
  5. 抢占式和非抢占式的进程调度
  6. Python面试题总结(9)--高级特性
  7. Diango博客--15.通过 Django Pagination 实现简单分页(一)
  8. Flask爱家租房--发布新房源(总结)
  9. esrgan_ESRGAN: Enhanced Super-Resolution Generative Adversarial Networks【阅读笔记】
  10. python剑指offer替换空格_迷人的算法-剑指offer面试题5:替换空格