我很難用交互式和非交互式shell。我不明白哪個是哪個。Bash交互式和非交互式shell行爲
例如,我讀過非交互式shell通常在其啓動時檢查BASH_ENV
變量並執行它指向的任何內容。
所以,我所做的是我設置BASH_ENV
指向一些腳本,只有回聲OK。然後我在終端輸入bash
,這個腳本回顯OK。但爲什麼?我沒有通過在終端輸入bash調用另一個INTERACTIVE shell,而不是另一種方式?爲什麼它執行bash_env?我在Linux的薄荷瑪雅。
我很難用交互式和非交互式shell。我不明白哪個是哪個。Bash交互式和非交互式shell行爲
例如,我讀過非交互式shell通常在其啓動時檢查BASH_ENV
變量並執行它指向的任何內容。
所以,我所做的是我設置BASH_ENV
指向一些腳本,只有回聲OK。然後我在終端輸入bash
,這個腳本回顯OK。但爲什麼?我沒有通過在終端輸入bash調用另一個INTERACTIVE shell,而不是另一種方式?爲什麼它執行bash_env?我在Linux的薄荷瑪雅。
的只有一點可以肯定的是什麼顯示在手冊頁對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
的內容),以查看從哪裏調用的內容。