# 練習 10:Bash:程序退出代碼(返回狀態)
> 原文:[Exercise 10. Bash: program exit code (return status)](https://archive.fo/ygzso)
> 譯者:[飛龍](https://github.com/wizardforcel)
> 協議:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
> 自豪地采用[谷歌翻譯](https://translate.google.cn/)
讓我們假設你要復制一個目錄。你可以通過鍵入`cp -vR /old/dir/path /new/dir/path`來執行此操作。發出此命令后,你可能想知道如何進行。目錄是否被復制?還是出現了一些錯誤,因為目標目錄空間不足,或其他出現錯誤的東西?
為了理解它是如何工作的,你必須了解兩個程序如何通信。我們先這樣說,bash 只是另一個程序,所以一般來說,當你發出上述的`cp`命令時,一個程序(bash,它是父進程)調用了另一個程序(`cp`,它是子進程)。
在 Linux 中,有一個標準機制,用于獲取從子進程到父進程的信息,這個機制稱為[退出狀態或返回代碼](http://en.wikipedia.org/wiki/Exit_status)。通過使用這種機制,當子進程完成其工作時,一個小的數字從子進程(或被調用者,這里是`cp`)傳遞給父進程(或調用者,這里是 bash)。當程序在執行期間沒遇到錯誤時,它返回`0`,如果發生某些錯誤,則此代碼不為零。就是這么簡單。Bash 中的這個退出代碼保存到`?`環境變量,你現在知道了,可以使用`$?`來訪問。
讓我再次重復一下我現在所說的話:
```
Bash 等待你的輸入
Bash 解析你的輸入
Bash 為你啟動程序,并等待這個程序退出
程序啟動
程序做你讓他做的事情
程序生成了退出代碼
程序退出并且將退出代碼返回給 Bash
Bash 將這個退出代碼賦給變量 ?
```
現在你學到了如何打印出你的程序的退出狀態。
## 這樣做
```
1: ls
2: echo $?
3: ls /no/such/dir
4: echo $?
```
## 你會看到什么
```
user1@vm1:~$ ls
hello.txt ls.out
user1@vm1:~$ echo $?
0
user1@vm1:~$ ls /no/such/dir
ls: cannot access /no/such/dir: No such file or directory
user1@vm1:~$ echo $?
2
user1@vm1:~$
```
## 解釋
+ 打印出一個目錄,成功。
+ 打印出`ls`的退出代碼,它是`0`,這意味著`ls`沒有遇到任何錯誤。
+ 嘗試打印出不存在的目錄,當然失敗。
+ 打印`ls /no/such/dir`的退出代碼,它確實是非零。
## 附加題
閱讀`man ls`的退出代碼部分。
- 笨辦法學 Linux 中文版
- 練習 0:起步
- 練習 1:文本編輯器,vim
- 練習 2:文本瀏覽器,少即是多
- 練習 3:Bash:Shell、.profile、.bashrc、.bash_history
- 練習 4:Bash:處理文件,pwd,ls,cp,mv,rm,touch
- 練習 5:Bash:環境變量,env,set,export
- 練習 6:Bash:語言設置,LANG,locale,dpkg-reconfigure locales
- 練習 7:Bash:重定向,stdin,stdout,stderr,<,>,>>,|,tee,pv
- 練習 8:更多的重定向和過濾:head,tail,awk,grep,sed
- 練習 9:Bash:任務控制,jobs,fg
- 練習 10:Bash:程序退出代碼(返回狀態)
- 練習 11:總結
- 練習 12:文檔:man,info
- 練習 13:文檔:Google
- 練習 14:包管理:Debian 包管理工具aptitude
- 練習 15:系統啟動:運行級別,/etc/init.d,rcconf,update-rc.d
- 練習 16:處理進程,ps,kill
- 練習 17:任務調度:cron,at
- 練習 18:日志:/var/log,rsyslog,logger
- 練習 19:文件系統:掛載,mount,/etc/fstab
- 練習 20:文件系統:修改和創建文件系統,tune2fs,mkfs
- 練習 21:文件系統:修改根目錄,chroot
- 練習 22:文件系統:移動數據,tar,dd
- 練習 23:文件系統:權限,chown,chmod,umask
- 練習 24:接口配置,ifconfig,netstat,iproute2,ss,route
- 練習 25:網絡:配置文件,/etc/network/interfaces
- 練習 26:網絡:封包過濾配置,iptables
- 練習 27:安全 Shell,ssh,sshd,scp
- 練習 28:性能:獲取性能情況,uptime,free,top
- 練習 29:內核:內核消息,dmesg
- 練習 30:打磨、洗練、重復:總復習
- 下一步做什么
- Debian 手動安裝