亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

shell的退出狀態碼,IFS環境變量,tee命令,cat > file << EOF 的用法

發布時間:2020-06-04 05:22:27 來源:網絡 閱讀:891 作者:騎士救兵 欄目:系統運維

退出狀態碼

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 正常范圍之外的退出狀態碼

舉例說明:

  • 無效的命令會返回一個退出狀態碼127。
  • 退出狀態碼126,表明用戶沒有執行命令的正確權限。
  • 給命令提供了無效參數,會產生一般性的退出狀態碼1,表明在命令中發生了未知錯誤。

exit 命令

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

退出狀態碼是一個0~255的整數,參數太大,會被系統取模。

IFS 字段分隔符

環境變量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之前保存原來的值,之后再恢復它:

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

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

指定多個IFS字符

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

IFS=$'\n':;"

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

tee 將輸出同時發送到屏幕和文件

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
$ 

利用這個方法,既能將數據保存在文件中,也能將數據顯示在屏幕上。這樣就可以在為用戶顯示輸出的同時再永久保存一份輸出的內容了。

cat > file << EOF 的用法

創建文件,在這之后輸入任何內容都是在文件里的。輸入完成之后EOF結尾,代表結束:

$ cat > test << EOF
> line 1,
> Line 2;
> LINE 3.
> EOF
$ cat test
line 1,
Line 2;
LINE 3.
$ 

輸出重定向將cat命令的輸出寫入文件(也可以用>>來追加內容)。輸入不再取自標準輸入,而是被重定向到命令行(或者腳本)之后的內容中。EOF符號標記了追加到文件中的數據的結束。
使用這個命令,在腳本中創建一個文件并寫入多行內容就很方便,

<<- 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命令的效果是不產生新的子進程,所以不是做永久重定向的,但是靠這個命令能實現永久重定向。命令具體的效果是什么在這里不重要。

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作為老牌的進制查看工具,使用上比較麻煩。且顯示方式上不如上面兩個工整。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

万年县| 湟中县| 云霄县| 木里| 桐乡市| 漳平市| 清水县| 华容县| 泽州县| 福安市| 织金县| 乌审旗| 长白| 东台市| 隆子县| 德清县| 巴青县| 哈密市| 买车| 仁寿县| 平武县| 长兴县| 舒兰市| 尚义县| 清水河县| 安龙县| 保康县| 西峡县| 承德县| 民乐县| 景德镇市| 兴安县| 阿拉尔市| 马尔康县| 石楼县| 江油市| 龙江县| 弥渡县| 潞城市| 昆山市| 南部县|