2013-04-23 131 views
0

我很難用交互式和非交互式shell。我不明白哪個是哪個。Bash交互式和非交互式shell行爲

例如,我讀過非交互式shell通常在其啓動時檢查BASH_ENV變量並執行它指向的任何內容。

所以,我所做的是我設置BASH_ENV指向一些腳本,只有回聲OK。然後我在終端輸入bash,這個腳本回顯OK。但爲什麼?我沒有通過在終端輸入bash調用另一個INTERACTIVE shell,而不是另一種方式?爲什麼它執行bash_env?我在Linux的薄荷瑪雅。

回答

2

只有一點可以肯定的是什麼顯示在手冊頁對bash(見INVOCATION) - 在那些啓動文件在每個實例上運行的詳細信息,其中列出。

但是,沒有任何東西停止(例如)其中一個啓動文件運行其他文件通常不會運行。

舉例來說,如果.bash_profile有以下行:

. ~/.profile 

它也將運行.profile腳本。

其實手冊頁指出:

當bash啓動非交互,運行shell腳本,例如,它會在環境變量BASH_ENV,如果它出現有擴大它的價值,並使用擴展值作爲文件的名稱來讀取和執行。 Bash的行爲就好像是執行以下命令:

if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi

所以,如果你把確切行啓動腳本像~/.bash_profile一個交互的shell,你還會源指向的文件BASH_ENV

最好的辦法是檢查INVOCATION部分,找出哪些文件將運行,然後通過它們跟蹤(在腳本的頂部有類似set -x的內容),以查看從哪裏調用的內容。