交互式shell(Interactive Shells)

本文來自於:

https://tiswww.case.edu/php/chet/bash/bashref.html#Interactive-Shells

 

在linux系統中,我們打開terminal就是開啓了一個Bash進程,也就是開啓了一個shell,此時的shell就是interactive shell。

下圖就開啓了一個interactive shell。echo $-時包含i

什麼是interactive shell? 

1. 啓動shell時,指定了-i選項,或

2. 啓動shell時,不存在non-option參數(即:全是 選項參數),不指定-c選項,且shell的stdin和stderr都連接到terminal(由isatty(3)所決定)

interactive shell一般都 讀&寫 用戶的terminal

啓動interactive shell時,可以使用-s調用選項(-s invocation option)來可以設置 位置參數(positionial parameter)

 

6.3.2 Is this Shell Interactive? 

如何確定shell是不是 interactive shell?

查看 特殊參數(special parameter) - 的值即可。如果-的值包含了i,則就是shell就是 interactive的;

另一種方式是檢查PS1變量

1. interactive shell時,PS1是設置過的;

2. non-interactive shell時,PS1則是未設置的

腳本中,查看 Bash運行在interactive下嗎?

case "$-" in
*i*)	echo This shell is interactive ;;
*)	echo This shell is not interactive ;;
esac

# 或者檢查 PS1變量
if [ -z "$PS1" ]; then
        echo This shell is not interactive
else
        echo This shell is interactive
fi
# 直接檢查下:
marvin@vm1:~/sf$ echo $-
himBHs         
marvin@vm1:~/sf$ 
# 直接檢查下PS1:
marvin@vm1:~/sf$ echo $PS1
\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$
marvin@vm1:~/sf$ 

 

6.3.3 Interactive Shell Behavior 

Interactive shell獨有的行爲( 和 non-interactive shell 不同的行爲)

1. Interactive shell 會 讀&執行 Bash Startup Files

2. Job Control默認開啓。Job Control開啓時,Bash忽略掉 鍵盤生成的Job Control 信號

    1. sigttin

    2. sigttou

    3. sigtstp

3. 讀取第一行命令前,Bash先 expand&display PS1;

   讀取多行命令 的第二行及後續行 命令前,Bash先 expands&display PS2;

   Bash讀取命令完成,但,尚未執行命令前,Bash先 expands&display PS0

4. 在打印出主提示符(primary prompt),即$PS1 前,Bash把 PROMPT_COMMAND變量的值 作爲命令執行

5. 利用readline命令 從用戶terminal中讀取 命令

6. 讀取命令時,當Bash從stdin中收到EOF,Bash不是立即退出,而是查看ignoreeof選項的值來設置-o

7. command history和history expansion是默認啓用的。Bash把命令歷史存儲到 $HISTFILE 文件中

8. alias expansion默認是啓用的

9. 不存在任何trap時,Bash忽略sigterm

10. 不存在任何trap時,sigint會被捕獲並被處理。sigint會中斷某些shell builtins

11. 如果開啓了shell選項 huponexit,interactive&login shell在退出時,給所有job發送 sighup

12. -n調用選項被忽略,set -n沒有任何作用

13. 取決於三個shell變量 MAIL, MAILPATH, MAILCHECK的值,Bash會週期性檢查mail

14. set -u已被啓用時,由於 引用unbound shell變量 而引起的expansion error 並不會使得shell退出

      也就是說,當set -u關閉時,引用unbound shell變量會導致shell直接退出

15. ${var:?word}時,由於 var未設置,或var爲null 而引起的expansion error 並不會使得shell退出

16. shell builtins 所遭遇的 redirection error 並不會使得shell退出

17. 運行在POSIX mode時,返回error status的某個shell builtins 並不會使得shell退出

18. 運行失敗的exec 並不會使得shell退出

19. 解析器語法錯誤 並不會使得shell退出

20. 對cd命令的目錄參數 簡單的拼寫糾正 默認開啓。shopt的cdspell選項控制着 cd命令的目錄參數 簡單的拼寫糾正

21. shell會檢查TMOUT變量的值,如果打印了PS1之後,在指定的秒數之內未讀取命令,則shell就退出

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章