Intereting Posts
вкладка-расширение и "./" bash shell Как применить этот патч revert commit от git? Пейджер Center Mutt горизонтально Как я могу получить список пакетов, которые я установил, используя apt-get? Как использовать команду tr для замены: полные остановки, восклицания и вопросительные знаки, за которыми следует пробел, с символами новой строки? Предоставление пользователям временного доступа к моему серверу для запуска команды tcpdump ждет секунды перед отображением пакетов grep – удаление текста после токена разделителя Как полностью удалить беспроводной интерфейс (и повторно добавить его)? Как использовать команду convert с bash для изменения размера всех изображений в заданном каталоге? В Debian в fluxbox GtkPod не имеет права на запись, но делает это в GNOME Извлечение линий на основе условий База данных MySQL Wi-Fi не работает Печатать строки, в которых первое поле имеет только четыре символа, используя регулярное выражение в awk?

Функция «pathmunge» для произвольных «PATH» -подобных переменных

Я уверен, что многие из вас знакомы с канонической функцией pathmunge используемой в точечных файлах, совместимых с Bourne-shell, для предотвращения дублирования записей в переменной PATH . Я также создал аналогичные функции для LD_LIBRARY_PATH и MANPATH , поэтому у меня есть следующие три функции в моем .bashrc :

 # function to avoid adding duplicate entries to the PATH pathmunge () { case ":${PATH}:" in *:"$1":*) ;; *) if [ "$2" = "after" ] ; then PATH=$PATH:$1 else PATH=$1:$PATH fi esac } # function to avoid adding duplicate entries to the LD_LIBRARY_PATH ldpathmunge () { case ":${LD_LIBRARY_PATH}:" in *:"$1":*) ;; *) if [ "$2" = "after" ] ; then LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$1 else LD_LIBRARY_PATH=$1:$LD_LIBRARY_PATH fi esac } # function to avoid adding duplicate entries to the MANPATH manpathmunge () { case ":${MANPATH}:" in *:"$1":*) ;; *) if [ "$2" = "after" ] ; then MANPATH=$MANPATH:$1 else MANPATH=$1:$MANPATH fi esac } 

Есть ли какие-то изящные способы, которыми я могу объединить эти три функции в один, чтобы уменьшить мой .bashrc файл? Может быть, путь, который я могу передать, в какой переменной проверять / устанавливать, аналогично передаче по ссылке в C?

Вы можете использовать eval для получения и установки значения переменной, зная ее имя; следующая функция работает как в Bash, так и в Dash :

 varmunge () { : ' Invocation: varmunge <varname> <dirpath> [after] Function: Adds <dirpath> to the list of directories in <varname>. If <dirpath> is already present in <varname> then <varname> is left unchanged. If the third argument is "after" then <dirpath> is added to the end of <varname>, otherwise it is added at the beginning. Returns: 0 if everthing was all right, 1 if something went wrong. ' : local pathlist eval "pathlist=\"\$$1\"" 2>/dev/null || return 1 case ":$pathlist:" in *:"$2":*) ;; "::") eval "$1=\"$2\"" 2>/dev/null || return 1 ;; *) if [ "$3" = "after" ]; then eval "$1=\"$pathlist:$2\"" 2>/dev/null || return 1 else eval "$1=\"$2:$pathlist\"" 2>/dev/null || return 1 fi ;; esac return 0 } 

В Bash 4.3 или новее вы можете использовать declare -n для эффективного передачи переменной по ссылке.

 # function to avoid adding duplicate entries to the PATH pathmunge () { declare -n thepath=$1 case ":${thepath}:" in *:"$2":*) ;; *) if [ "$3" = "after" ] ; then thepath=$thepath:$2 else thepath=$2:$thepath fi esac } 

Вы бы назвали это примерно так:

pathmunge PATH ~/bin

pathmunge MANPATH /usr/local/man after