原创 写代码的篮球球痴 嵌入式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$