婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 詳解bash中的退出狀態機制

詳解bash中的退出狀態機制

熱門標簽:黑暗之魂3地圖標注 如何申請400的電話呀 AI智能電銷機器人壞處 電話機器人對家居行業幫助大嗎 沈陽ai電銷智能機器人 電商外呼系統排名 蘭州電銷機器人加盟 地圖標注審核周期 合肥電銷外呼系統供應商

程序的退出狀態

當一個程序結束時會向父進程報告自己的退出狀態( exit status ). 通過傳遞 int 類型的變量給庫函數 exit 或系統調用 _exit 可以設置當前程序的退出狀態, 在 Linux 中, 通過 WEXITSTATUS 返回的退出狀態的值域為 [0, 255] 之間的整數 . 如果傳遞的值不在這個范圍內, 內核會自動幫你強轉為 u_int8_t . 通過 waitpid 庫函數可以得到子進程的退出狀態, 其值存儲在參數 wstatus 的低 8 位中.

// 定義在 wait.h 中
# define WEXITSTATUS(status)  __WEXITSTATUS (status)

// 定義在 waitstatus.h 中
/* If WIFEXITED(STATUS), the low-order 8 bits of the status. */
#define  __WEXITSTATUS(status)  (((status)  0xff00) >> 8)

下面這個例子展示了如何使用 waitpid 及相關宏函數獲取子進程的退出狀態:

#include unistd.h>
#include stdlib.h>
#include stdio.h>
#include sys/types.h>
#include sys/wait.h>

#define PARENT_EXIT 10086
#define CHILD_EXIT -10

int main()
{
  pid_t pid = fork();

  if (pid > 0)
  {
    int wstatus;
    // 父進程等待子進程執行完畢, 用 WUNTRACED 選項追蹤已結束的子進程
    pid_t child_pid = waitpid(pid, wstatus, WUNTRACED);

    if (WIFEXITED(wstatus))
      printf("Child exit status: %d\n", WEXITSTATUS(wstatus));
    else
      perror("Bad wait status\n");

    // 父進程退出
    exit(PARENT_EXIT);
  }
  else if (pid == 0)
  {
    // 子進程立即退出, 因此需要父進程設置 WUNTRACED
    exit(CHILD_EXIT);
  }
  else
  {
    // 處理 fork 時出現的錯誤
    perror("fork\n");
    exit(EXIT_FAILURE);
  }
}

編譯并運行上例可以得到被強轉后的狀態碼, 我們使用 WIFEXITED 判斷等待的子進程是否執行成功, 然后對執行成功子進程使用 WEXITSTATUS 獲取其退出狀態. 對程序來說, 最終的退出狀態就是主進程的退出狀態.

> gcc ecitcode.c;./a.out;echo "Parent exit status: $?"
Child exit status: 246 # -10 強轉為 uint8
Parent exit status: 102 # 10086 強轉為 uint8

在 POSIX 標準中規定退出狀態 0 代表該程序正常退出, 1 代表發生錯誤, 其他數字由程序自行規定, 因此在 glibc 的 stdlib.h 中僅定義了如下宏:

#define EXIT_FAILURE  1    /* Failing exit status. */
#define EXIT_SUCCESS  0    /* Successful exit status. */

程序本身一般會在文檔中事先約定每種退出狀態代表的退出原因( termination ), 例如在 ls 的幫助文檔中:

> ls --help
...其他內容...
Exit status: # 退出狀態
 0 if OK, # 正常執行
 1 if minor problems # 次要問題, 例如: 無法訪問子目錄
 2 if serious trouble # 嚴重錯誤, 例如: 無法訪問命令行參數
...其他內容...

命令的退出狀態

在 bash 中會記錄所執行命令的退出狀態, 可以通過 $? 獲取最近執行的命令的退出狀態. bash 自身的退出狀態為執行的最后一條命令的退出狀態, 也就等價于顯式指定 exit $? . 如果沒有執行任何命令就退出, 則 bash 的退出狀態為 0 , 要注意在 bash 中用 0 表示 true , 用非零表示 false .

# 用 exit 顯式指定退出狀態
> bash
> exit 98
exit
> echo $?
98

# 什么也不執行則退出狀態為 0
> bash
exit # Ctrl + D 退出
> echo $?
0

# 默認為最后一條命令的退出狀態
> bash
> ecasd
ecasd: command not found
exit # Ctrl + D 退出
> echo $?
127

在 bash 中對不同種類命令的退出狀態作出如下規定:

內置命令: 由于內置命令執行時不需要啟動額外的子進程, 因此需要用返回值模擬退出狀態. 每個函數都定義了自己的退出狀態, 例如: 內置命令 source 將腳本文件的最后一個命令的返回狀態作為命令的返回狀態. bash 中所有的內置命令都用退出狀態 2 表示用法錯誤, 例如: 選項錯誤, 缺少參數.

> cd -+- # 錯誤的參數
bash: cd: -+: invalid option
cd: usage: cd [-L|[-P [-e]] [-@]] [dir]
> echo $?
2

外部命令: 外部命令的退出狀態就是使用 waitpid 得到的子進程的退出狀態, 如果子進程在執行過程被編號為 N 的信號所終止, 則得到的退出狀態就為 128+N .

Shell 函數: 定義 shell 函數時, 函數名與之前已定義的只讀函數名相同則退出狀態為 1 , 當發生語法錯誤則退出狀態為 2 . 執行 shell 函數時, 函數中最后執行的一條命令的退出狀態就是整個函數的退出狀態.

# 二次定義只讀函數報錯
> func () { echo; }
> readonly -f func
> func; echo $?
0
> func () { echo poi; }
bash: func: readonly function
> echo $?
1

# 定義函數發生語法錯誤
> fune () {aa}
bash: syntax error near unexpected token '{aa}'
> echo $?
2

# 函數的退出狀態是最后執行的命令的退出狀態
> funr () { echo; return 6; }
> funr; echo $?
  # echo 打印的空行
6 # return 6 是函數中最后執行的命令

表達式: 使用 ((...)) 或 let 修飾的表達式的退出狀態取決于表達式的值, 如果表達式的值為 0 則退出狀態為 1 ; 如果表達式的值為非零, 則退出狀態為 0 .

> let 0+0; echo $?
1 # 表達式值為零
> ((7-5)); echo $?
0 # 表達式值非零

命令列表: 用 ; , , , || 連接命令被稱為命令列表, 其中用 和 || 連接的命令使用左關聯( left associativity )模式執行列表中的命令. 整個命令列表的退出狀態為最后一條命令的退出狀態. 此外, $( LISTS ) 以及流程控制結構如: for , while 等的返回狀態也是結構中的命令列表的退出狀態.

# 功能: 能ping通baidu.com則輸出 `baidu.com is up` , 否則輸出 `baidu.com is down` 。
> ping -c1 baidu.com > /dev/null  echo 'baidu.com is up' || echo 'baidu.com is down'
baidu.com is down
> echo $?
0 # 無論是否能 ping 通, 命令列表的退出狀態都等于最后一條命令的退出狀態

左關聯模式被廣泛應用于各種語言的邏輯運算符優化中. 對于邏輯與運算符 , 以 eq1 eq2 為例, 只有當兩邊都為 True 才會返回 True , 因此當 eq1 為 False 時, eq2 不會執行; 對于邏輯或運算符 || , 以 eq1 || eq2 為例, 只要兩邊有一個 True 就會返回 True , 因此當 eq1 為 True 時, eq2 不會執行。

腳本: 使用 . 或 source 運行腳本文件等同于在當前 bash 中執行代碼塊, 腳本中最后執行的命令的退出狀態就是腳本的退出狀態. 使用 ./腳本名 或 bash 腳本名 的方式執行腳本文件等同于執行外部命令, 腳本的退出狀態就是外部命令 bash 的退出狀態. 如果腳本中最后執行的命令是 exit , 那么使用 . 或 source 執行該腳本文件在執行結束后會退出當前 bash .

后臺作業與協作進程: 使用不帶選項的 wait 命令可以獲得最后一個執行完畢的后臺作業的退出狀態, 如果使用 wait -n jobsec> 可以獲得指定后臺作業的退出狀態, 如果作業不存在則退出狀態為 127 . 使用 coproc 在 sub shell 中執行的命令的退出狀態和后臺作業一樣可以被 wait 獲取, coproc 自身的退出狀態始終為 0 .

> { sleep 10; aad; } 
[1] 558
> wait -n 1
[1]+ Exit 127        { sleep 10; aad; }

> coproc { sleep 10; aad; }
[1] 558
> echo $?
0 # 這是 coproc 的執行結果
> jobs
[1]+ Exit 127        coproc COPROC { sleep 10; aad; }

管道命令: 默認情況下, 管道的退出狀態取決于管道中最后一條命令的退出狀態. 如果設置了 set -o pipefail , 那么只有在管道中的全部命令的退出狀態為 0 時, 整個管道的退出狀態才為 0 , 否則就是最后一個非零的退出狀態. 在管道前添加 ! 符號可以對整個管道的退出狀態取反. bash 中的特殊變量 $PIPESTATUS 以數組的形式存儲最近執行的前臺管道的退出狀態, 要注意的是單個命令也會被記錄, 也就是說 ${PIPESTATUS[0]} 和 $? 是等價的.

# 管道的退出狀態是最后一條命令的退出狀態
> ps | xxp 2>/dev/null | cat; echo $?
0
> set -o pipefail 
> ps | xxp 2>/dev/null | cat; echo $?
127 # 設置了 pipefail 因此得到最后一個非零退出狀態

# 管道中每個命令的退出狀態被按順序記錄在數組中
> easd 2>/dev/null | ls /nou 2>/dev/null | more 2>/dev/null
> echo ${PIPESTATUS[@]}
127 2 0

# 不帶管道符號的單個命令也會被記錄
> ping asbasdasd 2>/dev/null; echo ${PIPESTATUS[0]}
2
> ping asbasdasd 2>/dev/null; echo $?
2

參考資料

Exit status range
Bash man page

以上就是詳解bash中的退出狀態機制的詳細內容,更多關于bash 退出狀態 的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • StateMachine 狀態機機制深入解析
  • C++有限狀態機實現計算器小程序
  • 一個狀態機的實現
  • 簡單理解Python中基于生成器的狀態機
  • javascript與有限狀態機詳解
  • 淺析C# 狀態機Stateless

標簽:淮南 常州 河北 河池 隴南 黔南 通遼 黔南

巨人網絡通訊聲明:本文標題《詳解bash中的退出狀態機制》,本文關鍵詞  詳解,bash,中的,退出,狀態,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《詳解bash中的退出狀態機制》相關的同類信息!
  • 本頁收集關于詳解bash中的退出狀態機制的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    久久综合九色综合久久久精品综合| 日本亚洲欧美天堂免费| 国产精品自拍在线| 亚洲精品乱码久久久久久黑人| 欧美一区二区在线观看| 国产精品国模大尺度视频| 在线观看91av| 欧美一区二区私人影院日本| 欧美日韩成人激情| 日韩小视频在线观看专区| 欧美一区午夜精品| 中文字幕+乱码+中文字幕一区| 国产女主播一区| 亚洲男同1069视频| 久久国产生活片100| 国产91在线看| 色综合久久综合网97色综合| 欧美性色欧美a在线播放| 日韩你懂的在线播放| 精品电影一区二区三区| 国产精品久久久久久久久免费丝袜 | 国产欧美一区二区精品久导航| 久久综合久久综合亚洲| 久久久综合精品| 亚洲人成在线播放网站岛国 | caoporn国产一区二区| 成人污污视频在线观看| 欧美亚州韩日在线看免费版国语版| 精品日本一线二线三线不卡| 国产精品久久国产精麻豆99网站| 亚洲综合自拍偷拍| 韩国中文字幕2020精品| 欧美精品一二三四| 日韩一级成人av| 亚洲va中文字幕| 99精品视频一区| 精品免费日韩av| 久久91精品久久久久久秒播| 91在线播放网址| 亚洲综合一区二区三区| 99精品视频中文字幕| 久久精品一区二区三区不卡 | 欧美tk丨vk视频| 日韩av网站在线观看| 欧美午夜在线一二页| 亚洲大尺度视频在线观看| 5566中文字幕一区二区电影| 蜜桃视频一区二区三区在线观看| 亚洲成人动漫精品| 寂寞少妇一区二区三区| 欧美男同性恋视频网站| 国产乱码精品一品二品| 久久久久久久久久久久久夜| 成人一区二区三区中文字幕| 一区二区免费看| 在线成人免费视频| 丁香婷婷综合色啪| 亚洲最新在线观看| 精品国产乱码91久久久久久网站| 久久av中文字幕片| 亚洲二区在线观看| 久久九九99视频| 欧美一级电影网站| 99热这里都是精品| 日本午夜精品视频在线观看 | 99久久精品国产一区| 麻豆一区二区三区| 亚洲精品国产视频| 国产精品国产三级国产a | 亚洲欧美综合网| 欧美精品一区二区三区四区| 亚洲欧洲日韩在线| 欧美一区二区视频在线观看| 国产91精品一区二区| 精品一区二区三区久久久| 福利一区二区在线观看| 欧美精品一区二区三区一线天视频| 国产精品1区二区.| 国产成人在线观看免费网站| 五月激情综合色| 蜜臀av国产精品久久久久 | 亚洲国产视频a| 亚洲黄色在线视频| 亚洲欧美日韩精品久久久久| 综合久久一区二区三区| 中文字幕一区二| 亚洲激情中文1区| 偷拍亚洲欧洲综合| 日韩av一区二区三区| 麻豆精品视频在线观看视频| 激情综合色播五月| 成人午夜大片免费观看| www.欧美.com| 制服丝袜日韩国产| 精品成人免费观看| 亚洲免费观看高清完整| 日韩电影在线免费| 国产成a人亚洲精| 日本精品视频一区二区| 日韩一区二区电影网| 国产精品美女久久久久久| 视频一区二区不卡| 在线免费观看不卡av| 久久久久久久精| 美女免费视频一区二区| 日本久久电影网| 国产精品久久久久影院色老大 | 精品视频在线免费| 中文字幕一区免费在线观看| 国产成人精品免费| 久久久久青草大香线综合精品| 青青国产91久久久久久 | 日韩电影在线观看网站| 91在线免费视频观看| 国产精品久久久久久久久动漫| 麻豆精品视频在线| 精品国产91久久久久久久妲己| 偷偷要91色婷婷| 欧美人与性动xxxx| 亚洲一区二区三区爽爽爽爽爽| 99视频精品全部免费在线| 日本一区二区免费在线| 国产99精品国产| 一区二区三区欧美久久| 欧美日韩高清一区二区三区| 久久人人超碰精品| 欧美日韩在线直播| 精品一区二区三区在线观看国产| 91伊人久久大香线蕉| 久久精品国产**网站演员| 一区二区免费视频| 亚洲色图制服诱惑| 欧美精品第1页| 另类的小说在线视频另类成人小视频在线| 欧美电视剧免费全集观看| 国产激情视频一区二区三区欧美| 国产日产欧美精品一区二区三区| 久久99九九99精品| 日韩美女啊v在线免费观看| 欧美亚洲国产一区二区三区va| 蜜臀国产一区二区三区在线播放 | 精品国产伦一区二区三区观看方式| 国产一区日韩二区欧美三区| 美女尤物国产一区| 一区二区在线看| 亚洲欧美色图小说| 亚洲高清免费视频| 亚洲欧美日韩国产另类专区| 日韩午夜在线影院| 884aa四虎影成人精品一区| 国产成人丝袜美腿| 国产欧美一区二区三区网站| 欧美性videosxxxxx| 成人动漫一区二区| 狠狠狠色丁香婷婷综合激情 | 91.com视频| 日本高清不卡在线观看| 国产精品自在在线| 丁香桃色午夜亚洲一区二区三区| 黑人巨大精品欧美黑白配亚洲 | 麻豆视频观看网址久久| 日韩精品一级中文字幕精品视频免费观看 | 在线欧美小视频| 久久精品一区蜜桃臀影院| 欧美无砖砖区免费| 国产日韩精品视频一区| 日本少妇一区二区| 欧美日韩视频在线一区二区 | 国产三级一区二区| 国产高清一区日本| 日韩一区二区三区四区| 国产精品国产三级国产有无不卡| 欧美韩国日本一区| 亚洲第一精品在线| 国产电影一区二区三区| 91在线观看免费视频| 制服丝袜日韩国产| 中文字幕永久在线不卡| 五月激情综合网| 99久久伊人久久99| 欧美日韩国产高清一区| 久久久精品人体av艺术| 亚洲一区二区3| 国产伦精品一区二区三区在线观看| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 日本韩国视频一区二区| 国产精品福利一区| 国产成人精品一区二 | 久久九九久久九九| 亚洲成人一二三| 97超碰欧美中文字幕| 国产亚洲精品bt天堂精选| 日韩黄色在线观看| 欧洲中文字幕精品| 亚洲一二三四久久| 一道本成人在线| 国产精品美女www爽爽爽| 国产精品69毛片高清亚洲| 精品国产伦一区二区三区观看方式| 亚洲一区二区视频在线|