簡體   English   中英

了解bash腳本開頭的PATH變量導出

[英]understanding PATH variable export at the beginning of the bash script

我經常看到PATH變量在腳本的開頭導出。 例如在Debian Wheezy的/etc/init.d/rc腳本中:

PATH=/sbin:/usr/sbin:/bin:/usr/bin
export PATH

雖然我知道這可以確保腳本中使用的可執行文件是從正確的目錄啟動的,但我並不完全了解哪個shell受此export語句的影響。 例如,我在bash (PID 3987)中啟動名為rc (PID 6582;命令為“/ bin / sh /etc/init.d/rc”)的腳本:

init(1)-+-acpid(1926)
        |-sshd(2139)-+-sshd(2375)---bash(2448)---screen(3393)---screen(3394)-+-bash(3395)---vim(3974)
        |            |                                                       |-bash(3397)---pstree(6584)
        |            |                                                       `-bash(3987)---rc(6582)---sleep(6583)

我是否正確rc腳本中的此PATH導出語句僅影響帶有PID 6582的/ bin / sh,因為父shell(在我的示例中使用PID 3987進行bash)不會從子節點繼承變量? 另外,我是否更正在腳本rc中執行的所有命令都在帶有PID 6582的/ bin / sh下啟動,因此使用此PATH=/sbin:/usr/sbin:/bin:/usr/bin變量? 如果是的話,那么簡單的PATH = / sbin:/ usr / sbin:/ bin:/ usr / bin是不夠的?

環境變量由從腳本運行的所有進程繼承。 PATH特別影響C函數execlp()execvp() ,因此啟動sshdinit.d腳本啟動的所有進程及其后代都會受到影響,但只有在其中一個后代發生更改並且出口它。

特別是, bash(2448)最有可能改變它,因為它是一個登錄shell,以匹配系統和用戶的配置,所以它的所有后代都會受到這種變化的影響。

然后,當您手動運行/etc/init.d/rc腳本時, sleep命令會繼承更改(但是該命令永遠不會嘗試運行anithing)。

如果是的話,那么簡單的PATH = / sbin:/ usr / sbin:/ bin:/ usr / bin是不夠的?

如果您只是設置變量而不是導出它,則取決於rc腳本的運行方式。 如果它啟動任何試圖用任何這些函數運行命令的東西,那么不,只有在導出PATH它才會影響子代。

當腳本運行時, PATH應該已經由父shell導出,所以確實沒有必要。

我可以想象在運行腳本的shell可能無法正確初始化的情況下,例如在啟動過程中很早就運行的啟動腳本,但對於常規用戶空間腳本,應該按照您希望的方式設置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM