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