在.bashrc中更改$HOME的值

首先,让我简单介绍一下背景。对于术语的误用,我提前向大家道歉,请在必要时纠正我。
我的工作需要通过ssh远程在几台Ubuntu机器上运行模拟。这些机器都连接在一个网络中,并且我的账户在所有机器上都有关联,也就是说,$HOME/home/links/Ogaday,并且在每台机器上都有镜像。因此,我在其中一台机器上的文件夹中创建一个目录,它会出现在另一台机器上(这是一个我不知道如何使用正确术语的情况)。每台机器上还有本地内存,每个用户都可以访问,称为/scratch/。我将在/scratch/中创建一个目录来进行实际工作,因为我认为我的账户上的内存不足以在$HOME中运行模拟,并且这样做会更快,因为它都是本地操作。
现在,这些机器上安装了我需要使用的软件,而且它们安装在我没有写入权限的目录下(/usr/local/software/)。然而,该软件有一个bash脚本用于设置环境变量。我应该将这个bash脚本(source /usr/local/software/etc/bashrc)追加到$HOME/.bashrc中,以设置必要的环境变量。到目前为止都很标准,这样设置后,当我登录时就可以运行这个软件了,对吗?现在,我认为这些计算机上的软件配置不正确,因为.../etc/bashrc应该设置一个名为$SOFTWARE_INST_DIR的变量,即安装目录。默认情况下,它是$HOME/software,但必须更改bashrc文件,使其设置为/usr/local/software。当然,我没有写入权限来修改.../etc/bashrc。还有其他类似的问题,这只是第一个失败的事情。
作为修复方法,我将该文件复制到$HOME/software-etc/bashrc,并在$HOME/.bashrc中追加了source $HOME/software-etc/bashrc,而不是追加source /usr/local/software/etc/bashrc,这样我可以编辑它分配的变量。这样做有什么根本性的问题吗?我认为另一种解决方案是,不是从软件安装位置复制bashrc文件,而是在.bashrc中追加export $HOME=/scratch/ogaday,这样我可以重新分配我的主目录到scratch。我理解得对吗?这样做是否危险?除了用来运行长时间模拟,我可能不会在这些机器上做其他事情。

附注:我猜最终解决方法是让IT人员调查一下!不过,如果可能的话,我宁愿进行快速修复。


2只需将HOME=/scratch/ogaday写入,不需要使用export关键字,也不需要在变量赋值时加上$符号。 - Byte Commander
哦,我明白了。谢谢。我刚开始阅读这个文件。https://help.ubuntu.com/community/EnvironmentVariables。我现在看到区别了。 - Ogaday
1个回答

不,将rc文件复制到其他地方没有问题。话虽如此,虽然你确实可以通过在启动时的某个文件(例如~/.profile)中添加HOME=/foo来更改$HOME,但这真的不是一个好主意。HOME被许多东西使用,不仅仅是你的脚本,而且改变它没有理由会产生意想不到的后果。
例如,各种程序的默认配置文件,包括你的shell,都存储在$HOME中。如果你改变了它,你的设置将会丢失。
现在,如果我理解正确,你的主要目标是让$HOME/software指向/usr/local/software。与其复制文件,最简单的解决方案是将$HOME/software创建为指向/usr/local/software的链接。
重命名$HOME/software(如果已存在):
mv $HOME/software $HOME/software.old

创建一个名为$HOME/software的链接,指向/usr/local/software
ln -s /usr/local/software $HOME/software

现在,任何寻找$HOME/software的内容实际上会找到/usr/local/software。同样地,为了在每台机器上本地进行工作,创建/scratch目录并将其链接到$HOME
mkdir /scratch/ogaday
ln -s /scratch/ogaday $HOME/work

现在,你在$HOME/work中所做的一切实际上会发生在/scratch/ogaday中。
最后,请记住,有不同类型的shell。当你通过ssh登录时,你正在运行一个交互式登录shell,并且在许多系统上,这些shell会忽略$HOME/.bashrc。虽然Ubuntu也确实读取$HOME/.bashrc,但对于这些shell来说,许多其他发行版则不会。因此,更安全的做法是使用$HOME/.profile而不是$HOME/.bashrc来设置环境变量。请参阅这里以了解哪些文件在何时被读取的解释。

这看起来很不错。最后我没有重新定义$HOME,因为我觉得可能有问题。不过有一个问题,我在$HOME/work目录下进行的工作实际上是在scratch上进行的,这个工作会在网络上的其他机器上可见吗?因为$HOME在所有这些计算机上都同步(我实际上不知道那里的数据托管在哪个中央服务器上?),所以那个链接是本地的吗?也会同步吗?暂时将bashrc文件复制到本地已经起作用了,但我认为你的解决方案绝对是正确的做法。 - Ogaday
@Ogaday 这个链接将在所有计算机上显示,但它将指向各自计算机的 /scratch/ogaday 目录(如果存在)。所以,如果你在 machine2 上工作,machine2 将看不到它。顺便说一下,如果这个答案解决了你的问题,请花点时间点击左边的复选标志来接受它。这将标记问题已被回答并且是 Stack Exchange 网站上表达感谢之道。 - terdon
我肯定会的,听起来很完美,谢谢你的帮助。 - Ogaday
啊,上一条评论应该是“如果你在机器1上工作,机器2就看不到它”,当然。 - terdon
那是我读的方式哈。 - Ogaday