bash脚本中的“ source〜/ .profile”不起作用

时间:2019-05-24 12:29:06

标签: linux bash shell ubuntu go

要使用源代码永久更新〜/ .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 :(得分:0)

首选:

提供脚本本身而不是运行脚本-然后,脚本中的命令在 current 外壳程序中运行,包括 source ~/.profile

替代方法(因为它将替换正在运行的shell,因此历史记录,变量值和其他状态将丢失。因此,使用此方法应该有一个非常的充分理由):

使用exec bash或类似的名称代替source ~/.profile-这将用另一个实例替换当前正在运行的Bash,该实例本身将加载新的.profile

答案 1 :(得分:0)

这是一种重构,可以将决定推迟给用户并清理脚本。

#!/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