Или, как правило, как удалить элемент из списка разделенных двоеточием в переменной среды Bash?
Я думал, что видел простой способ сделать это много лет назад, используя более продвинутые формы расширения переменной Bash, но если так, я потерял его. Быстрый поиск Google показал удивительно мало релевантных результатов, и никто из них не назвал бы "простым" или "элегантным". Например, два метода с использованием sed и awk, соответственно:
PATH=$(echo $PATH | sed -e 's;:\?/home/user/bin;;' -e 's;/home/user/bin:\?;;')
PATH=!(awk -F: '{for(i=1;i<=NF;i++){if(!($i in a)){a[$i];printf s$i;s=":"}}}'<<<$PATH)
Не существует ничего простого? Есть ли что-либо аналогичное функции split() в Bash?
Update:
Похоже, мне нужно извиниться за свой преднамеренно неопределенный вопрос; Меня меньше интересовало решение конкретного случая использования, чем провоцирование хорошей дискуссии. К счастью, я получил его!
Здесь есть очень умные методы. В конце я добавил в свой набор инструментов следующие три функции. Магия происходит в path_remove, которая в значительной степени основана на умении Мартина Йорка использовать переменную awk
RS.
path_append () { path_remove $1; export PATH="$PATH:$1"; }
path_prepend () { path_remove $1; export PATH="$1:$PATH"; }
path_remove () { export PATH=`echo -n $PATH | awk -v RS=: -v ORS=: '$0 != "'$1'"' | sed 's/:$//'`; }
Единственный реальный рывок в этом случае - использование sed
для удаления заднего двоеточия. Учитывая, насколько справедливо остальное решение Мартина, я вполне согласен с этим жить!
Связанный вопрос: Как мне манипулировать элементами $PATH в сценариях оболочки?