2015-06-29 39 views
0

我有一個腳本,它執行一些基本的PATH完整性檢查,並在~/.bash_profile中輸入一行以獲取我的腳本,以便在根目錄PATH中對腳本所做的更改是永久的跨重啓:root PATH的腳本在重新啓動後發生改變並永久反映

cat path_clean 
#!/bin/bash 

OLD_PATH=`echo $PATH` 

OIFS=$IFS 
IFS=: 
for path in ${OLD_PATH}; do 
    [ -d "${path}" ] || continue 
    paths=("${paths[@]}" "${path}") 
done 

while read -r stat owner path; do 
    [ "${owner}${stat:5:1}${stat:8:1}" = 'root--' ] || continue 
    newpath="${newpath}:${path}" 
done < <(stat -c "%A:%U:%n" "${paths[@]}" 2>/dev/null) 

IFS=${OIFS} 

NEW_PATH=${newpath#:} 
export PATH=${NEW_PATH} 
egrep "^[ ]*if.*fi;" ~/.bash_profile &> /dev/null 
if [ $? -ne 0 ]; 
then 
    echo 'if [ -f /root/path_clean ]; then source /root/path_clean; fi;' >>  ~/.bash_profile 
fi 

一切運行正常,當我運行該腳本第一次是這樣的:

./path_clean 
. ~/.bash_profile 

但腳本有一個問題。如果我多次執行. ~/.bash_profile,那麼我會看到PATH變量中的值每次重複一次。

例如腳本執行之前我PATH是:

[[email protected] ~]# echo $PATH 
    /usr/bin/X11:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/ulticom/diameter/bin:/apps/omni/bin 

現在運行. ~/.bash_profile後第一時間,一切正常:

[[email protected] ~]# ./path_clean 
[[email protected] ~]# echo $PATH <--still same as original `PATH`, which is ok 
    /usr/bin/X11:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/ulticom/diameter/bin:/apps/omni/bin:/root/bin 
[[email protected] ~]# . ~/.bash_profile <--now sourcing `.bash_profile`1st time 
[[email protected] ~]# echo $PATH <--my script has changed `PATH` fine. 
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/ulticom/diameter/bin:/apps/omni/bin 
[[email protected] ~]# . ~/.bash_profile 
[[email protected] ~]# echo $PATH <-- problem starts 
    /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/ulticom/diameter/bin:/apps/omni/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/ulticom/diameter/bin:/apps/omni/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/ulticom/diameter/bin:/apps/omni/bin 
[[email protected] ~]# . ~/.bash_profile 
[[email protected] ~]# echo $PATH 
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/ulticom/diameter/bin:/apps/omni/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/ulticom/diameter/bin:/apps/omni/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/ulticom/diameter/bin:/apps/omni/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/ulticom/diameter/bin:/apps/omni/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/ulticom/diameter/bin:/apps/omni/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/ulticom/diameter/bin:/apps/omni/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/ulticom/diameter/bin:/apps/omni/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/ulticom/diameter/bin:/apps/omni/bin 

請建議什麼樣的變化,使腳本,以便使其工作正常並根除這個問題。

回答

1

我的猜測是,在使用之前你需要清除newpath。否則,它將保留最後一個source命令剩下的值。

+0

'path'和'newpath'都有這個問題。 –

+0

所以你建議在我的腳本中的這一行之後:'export PATH = $ {NEW_PATH}',我保留一個'未設置PATH,NEW_PATH'或者我應該保留它作爲腳本中的最後一行? –

+0

@ dig_123要麼'paths =(); newpath =「」在開始或在結束時取消設置。 (不要取消路徑!)我會去第一個選項,以防腳本出口 – Diego

相關問題