您好,登錄后才能下訂單哦!
shell中運(yùn)行的每個命令都使用退出狀態(tài)碼(exit status)。退出狀態(tài)碼是一個0~255的整數(shù),在命令結(jié)束運(yùn)行時有命令傳給shell。
Linux提供了一個專門的變量 $? 來保存上一個已執(zhí)行命令的退出狀態(tài)碼。對于需要進(jìn)行檢查的命令,必須在其運(yùn)行完畢后立刻查看或使用 $? 變量。它的值會變成有shell所執(zhí)行的最后一條命令的退出狀態(tài)碼。
一個成功結(jié)束的命令的退出狀態(tài)碼是0。Linux錯誤退出狀態(tài)碼沒有什么標(biāo)準(zhǔn)可循,但有一些可用的參考:
狀態(tài)碼 | 描述 |
---|---|
0 | 命令成功結(jié)束 |
1 | 一般性未知錯誤 |
2 | 不適合的shell指令 |
126 | 命令不可執(zhí)行 |
127 | 沒找到命令 |
128 | 無效的退出參數(shù) |
128+x | 與Linux信號x相關(guān)的嚴(yán)重錯誤 |
130 | 通過 Ctrl+C 終止的命令 |
255 | 正常范圍之外的退出狀態(tài)碼 |
舉例說明:
默認(rèn)情況下,shell腳本會以腳本中的最后一個命令的退出狀態(tài)碼退出。
使用exit命令可以改變這種行為,允許你在腳本結(jié)束時指定一個退出狀態(tài)碼。
退出狀態(tài)碼是一個0~255的整數(shù),參數(shù)太大,會被系統(tǒng)取模。
環(huán)境變量IFS,叫做內(nèi)部字段分隔符(internal field separator)。IFS環(huán)境變量定義了bash shell用作字段分隔符的一些列字符。默認(rèn)情況下是空格、制表符、換行符??梢愿倪@個環(huán)境變量。
因?yàn)槎际且恍┨厥庾址?,直接輸出是看不到的?/p>
$ echo "$IFS"
$ echo "$IFS" | od -b
0000000 040 011 012 012
0000004
$
這里轉(zhuǎn)成了八進(jìn)制。"040"是空格,"011"是制表符,"012"是換行符 。最后一個 012 是因?yàn)?echo 默認(rèn)是會換行的。
還可以試一下 -c 選項,這樣會打印出 \t 和 \n 但是空格還是空格,就不明顯了。
od命令
od命令系統(tǒng)默認(rèn)的顯示方式是八進(jìn)制,名稱源于Octal Dump。另外還有一個hexdump命令,以十六進(jìn)制輸出。功能上應(yīng)該有一些差別,用起來差不多,這里的情況把od命令替換為hexdump命令的效果應(yīng)該是一樣的。
hexdump有個-C(大寫)選項是od沒有的,這里沒什么效果,用來查看文件的時候效果好。
只識別換行符:
IFS=$'\n'
一個可參考的安全實(shí)踐是在改變IFS之前保存原來的值,之后再恢復(fù)它:
IFS_old=$IFS
IFS=$'\n'
<使用新的IFS值>
IFS=$IFS_old
這就保證了在腳本的后續(xù)操作中使用的是IFS的默認(rèn)值。建議在任何時候都這么做。
要指定多個IFS字符,只要將它們在賦值行串起來就行了:
IFS=$'\n':;"
這里將換行符、冒號、分號、雙引號作為字段分隔符。
tee命令相當(dāng)于管道的一個T型接頭。它將從STDIN過來的數(shù)據(jù)同時發(fā)往兩處。一處是STDOUT,另一處是tee命令行所指定的文件名。
默認(rèn)情況下,每次都會覆蓋文件:
$ date | tee test1
Fri Dec 6 16:32:59 CST 2019
$ cat test1
Fri Dec 6 16:32:59 CST 2019
$ date | tee test1
Fri Dec 6 16:33:10 CST 2019
$ cat test1
Fri Dec 6 16:33:10 CST 2019
$
如果想追加數(shù)據(jù),需要用-a選項:
$ cat test1
Fri Dec 6 16:33:10 CST 2019
$ date | tee -a test1
Fri Dec 6 16:34:00 CST 2019
$ cat test1
Fri Dec 6 16:33:10 CST 2019
Fri Dec 6 16:34:00 CST 2019
$
利用這個方法,既能將數(shù)據(jù)保存在文件中,也能將數(shù)據(jù)顯示在屏幕上。這樣就可以在為用戶顯示輸出的同時再永久保存一份輸出的內(nèi)容了。
創(chuàng)建文件,在這之后輸入任何內(nèi)容都是在文件里的。輸入完成之后EOF結(jié)尾,代表結(jié)束:
$ cat > test << EOF
> line 1,
> Line 2;
> LINE 3.
> EOF
$ cat test
line 1,
Line 2;
LINE 3.
$
輸出重定向?qū)at命令的輸出寫入文件(也可以用>>來追加內(nèi)容)。輸入不再取自標(biāo)準(zhǔn)輸入,而是被重定向到命令行(或者腳本)之后的內(nèi)容中。EOF符號標(biāo)記了追加到文件中的數(shù)據(jù)的結(jié)束。
使用這個命令,在腳本中創(chuàng)建一個文件并寫入多行內(nèi)容就很方便,
使用EOF表示結(jié)束的時候,必須要頂格寫,否則不認(rèn)。如果在腳本中使用,有時候希望代碼塊有縮進(jìn)。這時候就可以用這個:
If the redirection operator is <<-, then all leading tab characters are stripped from input lines and the line containing delimiter.
如果重定向的操作符是<<-,那么分界符(EOF)所在行的開頭部分的制表符(Tab)都將被去除。
不過這個只會忽略制表符,如果用空格縮進(jìn)還是用不上。
如果有大量的語句需要重定向,在每條命令后面都指定是相當(dāng)麻煩的。
下面的命令是,git放棄修改,強(qiáng)制覆蓋本地代碼:
git fetch --all && git reset --hard origin/master && git pull
即時合并成一行,這里也是3天命令。如果要將輸出重定向,僅僅在最后加上,則只會重定向最后一條命令的輸出。
exec命令的效果是不產(chǎn)生新的子進(jìn)程,所以不是做永久重定向的,但是靠這個命令能實(shí)現(xiàn)永久重定向。命令具體的效果是什么在這里不重要。
exec 1>/dev/null
git fetch --all && git reset --hard origin/master && git pull
這樣,在exec命令之后,所有的語句就都會重定向到指定的地方。
問題:一定重定向了STDOUT或STDERR,就很難在將它們重定向回原來的位置了。所以如果需要切換回來,重定向前先備份當(dāng)前的描述符。
可以將STDOUT的原來位置重定向到另外一個文件描述符,然后再利用該文件描述符重定向STDOUT:
exec 3>&1 && exec 1>/dev/null
git fetch --all && git reset --hard origin/master && git pull
exec 1<&3
先將 FD3 指向 STDOUT,指向 FD3 就是指向 STDOUT。然后就可以把 FD1 改了。之后,要再將 FD1 重新指向 STDOUT,指向 FD3 就是指向 STDOUT,所以通過 FD3 就又指回去了。
另外,下面的方法效果也是一樣的:
exec 4<&1 && exec 1>/dev/null
git fetch --all && git reset --hard origin/master && git pull
exec 1<&4
先將 STDOUT 指向 FD4,這樣就把 STDOUT 備份到 FD4了。之后再加備份的 FD4 里的 STDOUT 指回給 FD1。
有三個命令都可以像UltraEdit那樣以16進(jìn)制的方式查看文件。
hexdump的輸入格式最靈活,因?yàn)樗袑iT的參數(shù)指定格式, 常用選項 -C。
od沒什么特點(diǎn),od -x 和不帶選項的xxd差不多。
xxd還可以通過-r選項把16進(jìn)制表示的反轉(zhuǎn)換為正常的文件因?yàn)樗J(rèn)的表示方式和UltraEdit最像:以位移開頭,然后每兩字節(jié)一組,每行最后有相應(yīng)字節(jié)的文件顯示。
提到linux/unix下的進(jìn)制查看工具,不得不提到以上的三個工具。
hexdump在使用上和windows下的winhex接近。
xxd可以看作是od的升級產(chǎn)品。且其-r選項把16進(jìn)制表示的反轉(zhuǎn)換為正常的文件。比較像是ultraedit軟件的十六進(jìn)制查看。
od作為老牌的進(jìn)制查看工具,使用上比較麻煩。且顯示方式上不如上面兩個工整。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。