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

主頁 > 知識庫 > 詳解bash中的退出狀態(tài)機制

詳解bash中的退出狀態(tài)機制

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

程序的退出狀態(tài)

當一個程序結(jié)束時會向父進程報告自己的退出狀態(tài)( exit status ). 通過傳遞 int 類型的變量給庫函數(shù) exit 或系統(tǒng)調(diào)用 _exit 可以設(shè)置當前程序的退出狀態(tài), 在 Linux 中, 通過 WEXITSTATUS 返回的退出狀態(tài)的值域為 [0, 255] 之間的整數(shù) . 如果傳遞的值不在這個范圍內(nèi), 內(nèi)核會自動幫你強轉(zhuǎn)為 u_int8_t . 通過 waitpid 庫函數(shù)可以得到子進程的退出狀態(tài), 其值存儲在參數(shù) 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 及相關(guān)宏函數(shù)獲取子進程的退出狀態(tài):

#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;
    // 父進程等待子進程執(zhí)行完畢, 用 WUNTRACED 選項追蹤已結(jié)束的子進程
    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)
  {
    // 子進程立即退出, 因此需要父進程設(shè)置 WUNTRACED
    exit(CHILD_EXIT);
  }
  else
  {
    // 處理 fork 時出現(xiàn)的錯誤
    perror("fork\n");
    exit(EXIT_FAILURE);
  }
}

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

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

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

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

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

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

命令的退出狀態(tài)

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

# 用 exit 顯式指定退出狀態(tài)
> bash
> exit 98
exit
> echo $?
98

# 什么也不執(zhí)行則退出狀態(tài)為 0
> bash
exit # Ctrl + D 退出
> echo $?
0

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

在 bash 中對不同種類命令的退出狀態(tài)作出如下規(guī)定:

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

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

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

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

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

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

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

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

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

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

# 功能: 能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 通, 命令列表的退出狀態(tài)都等于最后一條命令的退出狀態(tài)

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

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

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

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

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

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

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

# 管道中每個命令的退出狀態(tài)被按順序記錄在數(shù)組中
> 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中的退出狀態(tài)機制的詳細內(nèi)容,更多關(guān)于bash 退出狀態(tài) 的資料請關(guān)注腳本之家其它相關(guān)文章!

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

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

巨人網(wǎng)絡(luò)通訊聲明:本文標題《詳解bash中的退出狀態(tài)機制》,本文關(guān)鍵詞  詳解,bash,中的,退出,狀態(tài),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《詳解bash中的退出狀態(tài)機制》相關(guān)的同類信息!
  • 本頁收集關(guān)于詳解bash中的退出狀態(tài)機制的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美三级日本三级少妇99| 亚洲欧洲日产国产综合网| 日韩高清不卡在线| 欧美一区二区三区四区视频| 免费视频一区二区| 久久亚洲免费视频| 成人av一区二区三区| 亚洲人亚洲人成电影网站色| 欧美三级蜜桃2在线观看| 亚洲成va人在线观看| 91麻豆精品91久久久久同性| 久久激情五月激情| 欧美高清一级片在线观看| 99国产精品久久久| 首页国产欧美久久| 国产亚洲欧洲一区高清在线观看| 99久久精品免费观看| 日韩综合一区二区| 国产欧美一区二区精品秋霞影院 | 日韩美女在线视频| 国产成人午夜精品5599| 一区二区激情小说| 精品成人私密视频| 欧美午夜一区二区三区| 久久99国产精品麻豆| 椎名由奈av一区二区三区| 欧美精品久久一区| 成人深夜福利app| 亚洲国产一区二区视频| 国产亚洲精品精华液| 欧美日韩精品系列| 国产电影精品久久禁18| 日韩精品色哟哟| 国产精品欧美一级免费| 日韩欧美中文字幕一区| 日本道免费精品一区二区三区| 日本不卡一二三区黄网| 亚洲婷婷综合久久一本伊一区| 欧美一区二区黄色| 欧美专区日韩专区| 欧美精品丝袜久久久中文字幕| 美女高潮久久久| 亚洲精品午夜久久久| 2021久久国产精品不只是精品| 欧美视频一区二区| 成人午夜又粗又硬又大| 蜜臀av一区二区三区| 亚洲精品国产精品乱码不99| 久久久不卡影院| 日韩欧美一区二区久久婷婷| 欧美日韩中文另类| 99精品国产热久久91蜜凸| 国产精品99久| 蜜桃久久精品一区二区| 亚洲第一会所有码转帖| 中文字幕日韩av资源站| 久久久久久麻豆| 26uuu欧美| 精品乱码亚洲一区二区不卡| 777奇米四色成人影色区| 欧洲视频一区二区| 日本道色综合久久| 91猫先生在线| av成人动漫在线观看| 成人黄色免费短视频| 国精产品一区一区三区mba视频| 玖玖九九国产精品| 欧美a级一区二区| 午夜成人免费电影| 亚洲丶国产丶欧美一区二区三区| 亚洲精品视频免费看| 亚洲欧美区自拍先锋| 亚洲伦理在线精品| 亚洲欧美日韩久久| 一区二区三区 在线观看视频| 亚洲裸体在线观看| 一区二区三区在线免费| 亚洲综合网站在线观看| 亚洲6080在线| 日日夜夜一区二区| 美国精品在线观看| 精品中文字幕一区二区小辣椒| 精品一区二区三区在线视频| 久久99国产精品成人| 国产精品亚洲视频| 97久久超碰精品国产| 91极品美女在线| 337p亚洲精品色噜噜| 欧美精品一区在线观看| 中文字幕欧美国产| 亚洲欧洲综合另类在线| 亚洲国产一区视频| 麻豆精品视频在线| 高清久久久久久| 一本到三区不卡视频| 欧美高清性hdvideosex| 日韩欧美一卡二卡| 国产精品久久久久久久久久久免费看 | 中文无字幕一区二区三区| 国产精品嫩草久久久久| 亚洲综合在线观看视频| 欧美aaaaa成人免费观看视频| 精品一区二区久久久| 99久久久精品免费观看国产蜜| 欧美三级韩国三级日本三斤| 精品精品欲导航| 亚洲天堂网中文字| 日本免费新一区视频| 国产成人av在线影院| 欧美日韩精品一区视频| 久久久久国产精品麻豆| 一区二区三区成人在线视频| 美女视频黄免费的久久 | 日本精品一级二级| 欧美一区二区三区喷汁尤物| 日本一区二区三区国色天香 | 精品久久人人做人人爽| 亚洲特级片在线| 狠狠色综合色综合网络| 在线观看亚洲a| 国产日韩精品一区二区三区| 亚洲在线观看免费视频| 国产91精品欧美| 制服丝袜国产精品| 亚洲三级电影全部在线观看高清| 免费高清视频精品| 97se亚洲国产综合自在线不卡| 精品久久久影院| 三级欧美韩日大片在线看| 91视频com| 久久久综合激的五月天| 日本欧美在线看| 欧美亚洲综合色| 亚洲三级视频在线观看| 国产精品1区2区| 欧美电影免费观看高清完整版在线| 亚洲欧美色图小说| www.日韩精品| 国产欧美一区二区三区沐欲| 麻豆精品国产传媒mv男同| 欧美日韩久久久一区| 亚洲黄色av一区| 不卡av在线免费观看| 国产欧美视频在线观看| 国产呦精品一区二区三区网站| 欧美日韩电影在线| 亚洲精品国产成人久久av盗摄 | 99re这里只有精品视频首页| 精品国产123| 激情深爱一区二区| 精品少妇一区二区三区在线视频| 日韩国产精品大片| 欧美肥妇bbw| 日韩avvvv在线播放| 69堂国产成人免费视频| 婷婷中文字幕一区三区| 欧美精品黑人性xxxx| 亚瑟在线精品视频| 777奇米四色成人影色区| 日韩精品国产精品| 日韩一区二区三区精品视频| 奇米综合一区二区三区精品视频| 91精品国模一区二区三区| 日本亚洲视频在线| 日韩一区二区精品| 精品中文字幕一区二区小辣椒| 欧美大片在线观看| 国产精品1024| 日本一区二区成人| 91视频www| 亚洲电影欧美电影有声小说| 91精品在线免费观看| 久草中文综合在线| 久久先锋影音av| 成人av在线电影| 亚洲综合成人在线| 欧美一区二区成人| 国产一区二区不卡在线| 国产精品久久久久9999吃药| 色诱视频网站一区| 日本少妇一区二区| 久久久五月婷婷| 色综合久久中文综合久久牛| 性久久久久久久久| 久久亚洲二区三区| 91女神在线视频| 日本麻豆一区二区三区视频| 日韩视频一区二区在线观看| 国产高清不卡一区二区| 亚洲天堂福利av| 欧美一区二区二区| 成人涩涩免费视频| 视频一区免费在线观看| 久久在线免费观看| 色婷婷久久99综合精品jk白丝| 亚洲18色成人| 国产精品欧美经典| 宅男在线国产精品| 99久久精品免费看| 日本成人在线电影网|