Вот альтернативный ответ с использованием массивов; к сожалению, для назначения ответа требуется два шага, но я все равно упоминаю об этом, поскольку он более общий и потенциально более универсальный, чем другие ответы:
IFS=: read -ra arr_gopath <<< "$GOPATH"
PATH="$PATH:${arr_gopath[0]/%//bin}"
Преимущество этого подхода заключается в том, что вы можете легко указать любой компонент GOPATH
, а не только первый. Или, чтобы добавить все элементы , за которыми следует /bin
, кPATH
:
PATH="$PATH:$(IFS=:; echo "${arr_gopath[*]/%//bin}")"
В обоих случаях (разделение, объединение )мы устанавливаем внутренний разделитель полей(IFS
)на символ двоеточия :
. Подстановка ${var/%//bin}
добавляет /bin
в конец выбранной переменной.
Тем не менее, если вы хотите добавить все компонентыGOPATH
с суффиксом /bin
к PATH
, то следующее будет проще и не требует массивов. Однако требуется, чтобы GOPATH
не было пустым:
PATH="$PATH:${GOPATH//://bin}/bin"
(${var//pattern/subst}
заменяет все вхождения pattern
на subst
, тогда как ${var/pattern/subst}
, использованное выше, заменяет только первое.)
Недостаточно репутации для комментариев, но в вашем пункте 4 написано $HOME/bin/gcc/bin
. Это правильно, или вы имели в виду $HOME/bin/
?
Если первое верно, то ваш PATH
явно неверен, так как он не содержит подкаталога gcc/bin
и похоже, что вы добавили дополнительный уровень подкаталогов (в gcc/
подкаталог с )по $HOME/bin
при символической ссылке.
В этом случае либо удалите символическую ссылку дополнительного слоя (на все исполняемые файлы из каталога $HOME/gcc_8_4/
в $HOME/bin
, либо настройте свой PATH
так, чтобы он включал $HOME/bin/gcc/bin
.