原创 写代码的篮球球痴 嵌入式Linux 2020-05-21

收录于话题

#Linux

130个

最近在做项目的时候遇到的几个知识点,我觉得非常有意思,以前学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$