У меня есть сценарий, который выполняет некоторую базовую проверку целостности корневого PATH и вводит строку в ~/.bash_profile для создания исходного сценария, так что изменения, сделанные в моем сценарии в PATH root, постоянны при перезапусках:

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 :

[root@labeir1 ~]# 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 первый раз, все в порядке:

[root@labeir1 ~]# ./path_clean
[root@labeir1 ~]# 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
[root@labeir1 ~]# . ~/.bash_profile <--now sourcing `.bash_profile`1st time
[root@labeir1 ~]# 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
[root@labeir1 ~]# . ~/.bash_profile
[root@labeir1 ~]# 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
[root@labeir1 ~]# . ~/.bash_profile
[root@labeir1 ~]# 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

Пожалуйста, предложите, какие изменения необходимо внести в скрипт, чтобы он работал нормально, и устраните эту проблему.

2 ответа2

0

Две строки, которые вы добавили:

echo 'if [ -d /root/path_clean ]; then source /root/path_clean; fi;' >> /etc/profile
echo 'if [ -d /root/path_clean ]; then source /root/path_clean; fi; >> ~/.bash_profile

проверить наличие каталога ; Вы, скорее всего, имели в виду:

echo 'if [ -f /root/path_clean ]; then source /root/path_clean; fi;' >> /etc/profile
echo 'if [ -f /root/path_clean ]; then source /root/path_clean; fi; >> ~/.bash_profile

Обратите внимание на «-f» внутри скобок.

0

Используйте правильную проверку.

[ -d … ] проверяет, является ли данный путь каталогом, что, очевидно, не ваш скрипт.

Вы, вероятно, хотели -f , -s или -e .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .