Сброс переменных bash, ссылающихся на несуществующие каталоги

Сброс переменных bash, ссылающихся на несуществующие каталоги

У меня есть файл, источником которого является приложение, добавляющее соответствующие каталоги в $PATH и $LD_LIBRARY_PATH.

Это нормально, но приводит к несколько чрезмерному загрязнению $PATH и $LD_LIBRARY_PATH, поскольку добавляется довольно много путей, около 2/3 из которых не существуют.

Я могу проверить существование каталога с помощью [ ! -d $VARIABLE_TO_ADD_TO_PATH ], но если я обнаружу, что каталог не существует, удалить его, по-видимому, будет сложнее.

Я могу написать (для каждой из, может быть, 10 переменных)

if [ ! -d $VAR ]
    unset VAR
fi

но я бы предпочел провести мероприятие.

Я пытался:

_testPathAndUnset()
{
   while [ $# -ge 1 ]
   do
      dirToTest=${1/startPattern/\$startPattern}
      if [ ! -d $dirToTest ]
         unset $1
      fi
      shift
   done
}

передаю значения в форме _testPathAndUnset VAR1 VAR2 VAR3(not $VAR1 $VAR2 $VAR3), но теперь у меня есть строки, которые не расширяются.

Использование evalмогло бы решить эту проблему для меня, но другие вопросы, ответы, веб-сайты и т. д. говорят о том, что это, как правило, плохая идея.

Как можно решить эту задачу лучше, чем 30 строк 10x3?

if [ ! -d $VAR ]
    unset VAR
fi

решение1

Вот функция:

_testPathAndUnset() { for d in "$@"; do [ -d "${!d}" ] || unset "$d"; done; }

Вот он в использовании. Для начала у нас есть два каталога:

$ ls -d */
a1/  a2/

Мы определяем четыре переменные оболочки, которые могут или не могут быть оценены как каталоги:

$ one=a1; two=a2; three=a3; four=a4

Теперь запустим нашу функцию по этим четырем переменным:

$ _testPathAndUnset one two three four

И обратите внимание, что остаются заданными только две переменные:

$ echo "one=$one two=$two three=$three four=$four"
one=a1 two=a2 three= four=

Подробности:

  • for d in "$@"

    Это циклически перебирает все аргументы в командной строке.

  • [ -d "${!d}" ] || unset "$d"

    Здесь dотносится к имени переменной. ${!d}относится к значению переменной с именем d. Это проверяет, является ли значение переменной с именем dкаталогом. Если это не так, [тест оценивается как ложный и unset "$d"выполняется предложение.

Связанный контент