Linux 下的0 1 2特殊文件描述符~
最近在做項(xiàng)目的時(shí)候遇到的幾個(gè)知識(shí)點(diǎn),我覺(jué)得非常有意思,以前學(xué)Linux的時(shí)候也有接觸到管道方面的,但是在應(yīng)用中卻基本沒(méi)有遇到過(guò)。
還有Linux下的幾個(gè)特殊的文件描述符,用這幾個(gè)文件描述符可以做很多事情,能做什么事情決定你自己的本事了。
#Linux下的 0 1 2文件描述符
1 是標(biāo)準(zhǔn)輸出(stdout)
2 是標(biāo)準(zhǔn)錯(cuò)誤輸出(stderr)
0 是標(biāo)準(zhǔn)輸入(stdin)
第一個(gè)
但是我們使用的時(shí)候,我們會(huì)把這樣使用 1> 兩個(gè)符號(hào)連著一起,而且呢,1和>符號(hào)之間不能有空格,有空格和沒(méi)有空格就是兩回事了。
如下,把標(biāo)準(zhǔn)輸出結(jié)果重定向到 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:~$第二個(gè)
把標(biāo)準(zhǔn)錯(cuò)誤輸出重定向到list文件里面,但是我們就簡(jiǎn)單執(zhí)行l(wèi)s,所以沒(méi)有錯(cuò)誤,當(dāng)我們執(zhí)行cat的時(shí)候,自然就是沒(méi)有任何輸出了。
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:~$第三個(gè)
&是不是很像取地址符號(hào),我們往標(biāo)準(zhǔn)輸入 echo 一個(gè)字符串,然后屏幕就打印了這個(gè)字符串出來(lái)。就是這么簡(jiǎn)單,就是這么講道理。
linux@ubuntu:~$ echo "1212" >&0 1212 linux@ubuntu:~$#簡(jiǎn)單的應(yīng)用
我們?cè)贚inux下,經(jīng)常用到find 這個(gè)指令,如果find的時(shí)候,如果find某些文件夾沒(méi)有權(quán)限的話,就會(huì)提示一些錯(cuò)誤。讓你看到輸出很惡心。比如
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:~$我們要是只想看到正確的輸出,把錯(cuò)誤的輸出都扔進(jìn)垃圾桶,應(yīng)該怎么做呢?
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:~$這樣看起來(lái)是不是很舒服了?
免費(fèi)再贈(zèng)送一個(gè)例子,我們?cè)贏ndroid設(shè)備里面經(jīng)常需要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我們換個(gè)寫法,就會(huì)發(fā)現(xiàn)不一樣的世界
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這樣的輸出是不是讓你覺(jué)得非常爽,是的,這樣的輸出讓我也覺(jué)得非常爽。
#/dev/null
我們?cè)谏厦嬉呀?jīng)用了 /dev/null ,現(xiàn)在來(lái)剖析一下。
這個(gè)東東有意思,如果我們有一些輸出不想看到,就重定向到這里,這個(gè)就好像一個(gè)能吸納所有東西的無(wú)底洞一樣。非常有意思。
如果我們當(dāng)前沒(méi)有一個(gè)文件
linux@ubuntu:~$ ls 1212.txt ls: cannot access 1212.txt: No such file or directory linux@ubuntu:~$這時(shí)候就會(huì)提示沒(méi)有這個(gè)文件,如果我們不想看到這個(gè)惡心的輸出,可以這樣做
linux@ubuntu:~$ ls 1212.txt 2>/dev/null linux@ubuntu:~$作用就是把 stderr 輸出到 /dev/null 這個(gè)垃圾桶里面。
#2>&1
對(duì)于2>&1的理解,2就是標(biāo)準(zhǔn)錯(cuò)誤,1是標(biāo)準(zhǔn)輸出,那么這條命令不就是相當(dāng)于把標(biāo)準(zhǔn)錯(cuò)誤重定向到標(biāo)準(zhǔn)輸出么?
是的。為什么是&1而不是1,這里& 符號(hào)是什么?& 符號(hào)可以理解為引用(reference)。&1 就是對(duì)標(biāo)準(zhǔn)輸出的引用。「我覺(jué)得可以理解為我們C語(yǔ)言里面的取地址符號(hào),拿到標(biāo)準(zhǔn)輸出的地址,往地址里面灌什么,標(biāo)準(zhǔn)輸出就會(huì)給你輸出什么」
#后臺(tái)運(yùn)行指令
##nohup
nohup 指的是把命令放后臺(tái)運(yùn)行,并且不掛斷的運(yùn)行,他會(huì)把輸出默認(rèn)定向到文件nohup.out中。
##&
這個(gè)指令指的是在后臺(tái)運(yùn)行。
## 實(shí)例
我們兩個(gè)指令一起使用試試
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$然后過(guò)了一下看看
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$看看后臺(tái)進(jìn)程
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$總結(jié)
以上是生活随笔為你收集整理的Linux 下的0 1 2特殊文件描述符~的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 基于链队列的银行叫号系统
- 下一篇: CPU 和 GPU