Не работает «source ~ / .profile» внутри bash-скрипта - PullRequest
0 голосов
/ 24 мая 2019

Для постоянного обновления ~ / .profile с источником, работающего только на ручном вводе.Кроме того, перезагрузка всей системы не приведет к обновлению ~ / .profile, и мне нужно обновить его вручную.

Существует ли специальный стиль кода для использования его в качестве рабочего кода внутри скрипта bash / shell или это специальныйкод, не предназначенный для использования в автоматизированных сценариях?

Нужно ли это для автоматизации установки golang.

В следующем коде строка «source ~ / .profile» не будет работать, и безлюбые сообщения об ошибках, остальное работает нормально:

#!/bin/bash
sudo apt update
sudo apt -y upgrade
cd ~
curl -O https://dl.google.com/go/go1.12.5.linux-amd64.tar.gz
tar xvf go1.12.5.linux-amd64.tar.gz
sudo chown -R root:root ./go
sudo mv go /usr/local
cd ~
sudo rm go1.12.5.linux-amd64.tar.gz
sudo echo "export GOPATH=\$HOME/work" >> ~/.profile
sudo echo "export PATH=\$PATH:/usr/local/go/bin:\$GOPATH/bin" >> ~/.profile
source ~/.profile

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

Вот рефакторинг, который откладывает решение до пользователя и несколько очищает скрипт.

#!/bin/bash
# Put this in a variable so there is only one place to update
tarball='go1.12.5.linux-amd64.tar.gz'
sudo apt update
sudo apt -y upgrade
# cd || why would you?
curl -O "https://dl.google.com/go/$tarball"
tar xvf "$tarball"
sudo chown -R root:root ./go
sudo mv go /usr/local
rm "$tarball"
printf '%s\n' "export GOPATH=\$HOME/work" \
       "export PATH=\$PATH:/usr/local/go/bin:\$GOPATH/bin" >> ~/.profile
echo "$0: done. source ~/.profile or exec bash to activate new settings." >&2
0 голосов
/ 24 мая 2019

Предпочитаемый:

Исходный код самого сценария, а не его запуска - тогда команды в сценарии выполняются в текущей оболочке, , включая source ~/.profile.

Альтернатива (поскольку это заменяет работающую оболочку, история, значения переменных и другие состояния будут потеряны. Поэтому должна быть очень веская причина для использования этого метода):

Используйте exec bash или что-то подобное вместо source ~/.profile - это заменит работающий в настоящее время Bash другим экземпляром, который сам загрузит новый .profile.

...