溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

shell的退出狀態(tài)碼,IFS環(huán)境變量,tee命令,cat > file << EOF 的用法

發(fā)布時間:2020-06-04 05:22:27 來源:網(wǎng)絡(luò) 閱讀:888 作者:騎士救兵 欄目:系統(tǒng)運(yùn)維

退出狀態(tài)碼

shell中運(yùn)行的每個命令都使用退出狀態(tài)碼(exit status)。退出狀態(tài)碼是一個0~255的整數(shù),在命令結(jié)束運(yùn)行時有命令傳給shell。

查看退出狀態(tài)碼

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)碼

舉例說明:

  • 無效的命令會返回一個退出狀態(tài)碼127。
  • 退出狀態(tài)碼126,表明用戶沒有執(zhí)行命令的正確權(quán)限。
  • 給命令提供了無效參數(shù),會產(chǎn)生一般性的退出狀態(tài)碼1,表明在命令中發(fā)生了未知錯誤。

exit 命令

默認(rèn)情況下,shell腳本會以腳本中的最后一個命令的退出狀態(tài)碼退出。
使用exit命令可以改變這種行為,允許你在腳本結(jié)束時指定一個退出狀態(tài)碼。

退出狀態(tài)碼是一個0~255的整數(shù),參數(shù)太大,會被系統(tǒng)取模。

IFS 字段分隔符

環(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'

臨時更改IFS

一個可參考的安全實(shí)踐是在改變IFS之前保存原來的值,之后再恢復(fù)它:

IFS_old=$IFS
IFS=$'\n'
<使用新的IFS值>
IFS=$IFS_old

這就保證了在腳本的后續(xù)操作中使用的是IFS的默認(rèn)值。建議在任何時候都這么做。

指定多個IFS字符

要指定多個IFS字符,只要將它們在賦值行串起來就行了:

IFS=$'\n':;"

這里將換行符、冒號、分號、雙引號作為字段分隔符。

tee 將輸出同時發(fā)送到屏幕和文件

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)容了。

cat > file << EOF 的用法

創(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

使用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 命令

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。

進(jìn)制查看工具

有三個命令都可以像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)制查看工具,使用上比較麻煩。且顯示方式上不如上面兩個工整。

向AI問一下細(xì)節(jié)

免責(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)容。

AI