最近在看《Linux Shell編程從入門到精通》這書,把之前朦朧的知識再鞏固一下蒸矛,作些記錄浅悉。
一柿汛,&和&&,|和||區(qū)別
& 表示任務(wù)在后臺執(zhí)行冗酿,如要在后臺運行redis-server,則有 redis-server &
&& 表示前一條命令執(zhí)行成功時,才執(zhí)行后一條命令 络断,如 echo 'hello‘ && echo 'nihao'
| 表示管道裁替,上一條命令的輸出,作為下一條命令參數(shù)妓羊,如 echo 'hello' | wc -l
|| 表示上一條命令執(zhí)行失敗后胯究,才執(zhí)行下一條命令,如 cat nofile || echo "failed"
二躁绸,2>&1的意思
Linux 中三種標(biāo)準(zhǔn)輸入輸出裕循,分別是STDIN,STDOUT净刮,STDERR剥哑,對應(yīng)的數(shù)字是0,1淹父,2株婴。
STDIN就是標(biāo)準(zhǔn)輸入,默認(rèn)從鍵盤讀取信息暑认;STDOUT是標(biāo)準(zhǔn)輸出困介,默認(rèn)將輸出結(jié)果輸出至終端,也就是顯示器之類的東西蘸际;STDERR是標(biāo)準(zhǔn)的錯誤信息座哩,默認(rèn)也會顯示在終端上。由于STDOUT與STDERR都會默認(rèn)顯示在終端上粮彤,為了區(qū)分二者的信息根穷,就有了編號的0姜骡,1,2的定義屿良,用1表示STDOUT圈澈,2表示STDERR。
command > a ---等于 command 1> a 尘惧,默認(rèn)即為標(biāo)準(zhǔn)輸出康栈,錯誤輸出會到當(dāng)前終端。
command > a 2> a ---分別定義標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤輸出褥伴,打開文件兩次谅将。
command > a 2>&1 ---&1的含義就可以理解為用標(biāo)準(zhǔn)輸出的引用漾狼,打開文件一次重慢。
cat 0< ps.sh 2>&1 > testfunc.sh ---將ps.sh作為輸入,標(biāo)準(zhǔn)和錯誤輸出到testfunc.sh逊躁。
cat 0< ps.sh 2>&1 > testfunc.sh ---等于 cat < ps.sh 2>&1 > testfunc.sh似踱,標(biāo)準(zhǔn)輸入為0.
cat 0< ps.sh &> testfunc.sh ---&> 這個符號,就包含了標(biāo)準(zhǔn)和錯誤輸出稽煤,好像和2>&1類似核芽。
'>'只能將正常信息重定向, 與 1> 相同
'&>'可以將錯誤信息或者普通信息都重定向輸出
2>&1 意思是把 標(biāo)準(zhǔn)錯誤輸出 重定向到 標(biāo)準(zhǔn)輸出.
&>file 意思是把標(biāo)準(zhǔn)輸出 和 標(biāo)準(zhǔn)錯誤輸出 都重定向到文件file中
grep da * > greplog1
grep da * > greplog2 1>&2
grep da * > greplog3 2>&1 //grep da * 2> greplog4 1>&2 結(jié)果一樣
#查看greplog1會發(fā)現(xiàn)里面只有正常輸出內(nèi)容
#查看greplog2會發(fā)現(xiàn)里面什么都沒有
#查看greplog3會發(fā)現(xiàn)里面既有正常輸出內(nèi)容又有錯誤輸出內(nèi)容
三,/dev/null和/dev/zero
把/dev/null看作”黑洞”酵熙, 它等價于一個只寫文件轧简,所有寫入它的內(nèi)容都會永遠(yuǎn)丟失.,而嘗試從它那兒讀取內(nèi)容則什么也讀不到匾二。然而哮独, /dev/null對命令行和腳本都非常的有用。
像/dev/null一樣察藐, /dev/zero也是一個偽文件皮璧, 但它實際上產(chǎn)生連續(xù)不斷的null的流(二進(jìn)制的零流,而不是ASCII型的)分飞。 寫入它的輸出會丟失不見悴务, 而從/dev/zero讀出一連串的null也比較困難, 雖然這也能通過od或一個十六進(jìn)制編輯器來做到譬猫。
/dev/zero主要的用處是用來創(chuàng)建一個指定長度用于初始化的空文件讯檐,就像臨時交換文件。
#!/bin/bash
# 創(chuàng)建一個交換文件.
ROOT_UID=0 # Root 用戶的 $UID 是 0.
E_WRONG_USER=65 # 不是 root?
FILE=/swap
BLOCKSIZE=1024
MINBLOCKS=40
SUCCESS=0
# 這個腳本必須用root來運行.
if [ "$UID" -ne "$ROOT_UID" ]
then
echo; echo "You must be root to run this script."; echo
exit $E_WRONG_USER
fi
blocks=${1:-$MINBLOCKS} # 如果命令行沒有指定染服,
if [ "$blocks" -lt $MINBLOCKS ]
then
blocks=$MINBLOCKS # 最少要有 40 個塊長.
fi
echo "Creating swap file of size $blocks blocks (KB)."
dd if=/dev/zero of=$FILE bs=$BLOCKSIZE count=$blocks # 把零寫入文件.
mkswap $FILE $blocks # 將此文件建為交換文件(或稱交換分區(qū)).
swapon $FILE # 激活交換文件.
echo "Swap file created and activated."
exit $SUCCESS
四别洪,nohup和&
nohup命令可以將以忽略掛起信號的方式運行起來,被運行的程序的輸出信息將不會顯示到終端肌索。無論是否將nohup命令的輸出重定向到終端蕉拢,輸出都將附加到當(dāng)前目錄下的nohup.out文件中特碳。如果當(dāng)前目錄的nohup.out文件不可寫,輸出重定向到$HOME/nohup.out文件中晕换。如果沒有文件能創(chuàng)建或打開以用于追加午乓,那么command參數(shù)指定的命令不可調(diào)用。如果標(biāo)準(zhǔn)錯誤是一個終端闸准,那么把指定的命令寫給標(biāo)準(zhǔn)錯誤的所有輸出作為標(biāo)準(zhǔn)輸出重定向到相同的文件描述符益愈。
nohup是永久執(zhí)行的意思,而 & 是指在后臺運行夷家。就是指蒸其,用nohup運行的命令或程序可以永久的執(zhí)行下去,和用戶終端沒有關(guān)系库快,例如我們斷開ssh連接都不會影響他的運行摸袁。
- 當(dāng)我們用 & 運行的程序是守護(hù)進(jìn)程時,我們斷開終端后這個守護(hù)進(jìn)程會繼續(xù)在后臺運行义屏。如果這個進(jìn)程不是守護(hù)進(jìn)程時靠汁,當(dāng)我們斷開終端后,這個進(jìn)程也跟著斷開停止運行了闽铐。
由于使用nohup時蝶怔,會自動將輸出寫入nohup.out文件中,如果文件很大的話兄墅,nohup.out就會不停的增大踢星,這是我們不希望看到的,因此隙咸,可以利用/dev/null來解決這個問題沐悦。
(1)舍棄標(biāo)準(zhǔn)輸出,將錯誤輸出到log文件中
nohup node bin/www >/dev/null 2>log &
(2)如果錯誤信息也不想要的話:
nohup node bin/www >/dev/null 2>&1 &
注:其中node bin/www是項目node啟動
參考URL:
https://blog.csdn.net/wufaliang003/article/details/80275055
https://www.cnblogs.com/yanzibuaa/p/7808437.html
https://blog.csdn.net/u014284252/article/details/51784217
https://www.cnblogs.com/kcxg/p/11076461.html
https://blog.51cto.com/ibmcn/2348741
https://msd.misuland.com/pd/3255817963235708312
https://blog.csdn.net/cristik/article/details/82785847