有什么方法可以让我在不编辑内存中文件的情况下设置环境变量并影响其他 shell,这将对连接该计算机的任何新用户生效,并且仅在下次重新启动 Linux 计算机后才会生效?
我试图记住我的linux中的一些东西,这些东西仅在机器启动时才有效(来自脚本)(因此我不需要文件),所以从我的shell中我想设置一些标志对于任何连接的用户都有效,例如:
linux_test_run=yes
但是我希望它对在该 Linux 上打开的任何新 shell 都有效。我希望下次有人重新启动该机器时该变量就会消失......
有什么(简单的)可以让我实现这一目标吗? (不使用文件...)
答案1
您可以使用export
来标记要传递给环境中的子进程的变量。
export linux_test_run=yes
如果您希望新连接的用户可以使用该变量,则需要编辑 shell 的初始化文件。
答案2
好吧,其中的文件/tmp
通常会在重新启动时清理,所以为什么不让一些脚本在其中获取文件,类似于“如果该文件存在,则获取它”之类的内容?然后,您可以根据需要在该文件中进行初始化。这可以放入一些 bash 初始化文件中,该文件是通过登录 shell(如/etc/profile
. (这假设您希望它由交互式 shell 而不是登录 shell 获取。)
不过,我不太清楚上下文。如果您可以提供有关您正在尝试做什么的更多详细信息,您会得到更好的答案。
答案3
大多数登录方法从 读取环境变量/etc/profile
。 (可能还有其他可能性,但这是最容易采取行动的。)因此,如果我理解正确的话,您希望在/etc/profile
下次重新启动时添加环境变量分配,并在之后重新启动时将其删除。
首先,如果您还没有(某些发行版设置了它),请创建一个名为 的目录/etc/profile.d
并将此代码片段添加到/etc/profile
:
for x in /etc/profile.d/*.sh; do
. "$x"
done
unset x
创建一个包含export linux_test_run=yes
名为/etc/profile.d/test_run.sh.0
.
将以下代码片段添加到/etc/rc.local
(或在启动时执行的其他一些脚本):
for x in /etc/profile.d/*.sh.[0-9]*; do
n=${x##*.} # extract the part after the last .
case n in
*[!0-9]*) continue;; # n is not a number, so skip this file
*[1-9]*) mv "$x" "${x%.*}.$(($n-1))";; # decrement the number in the file name
*) # the file is *.sh.0, so rename to .sh and schedule for deletion
echo "${x%.*}" >>/etc/profile.d/cancel-on-reboot.list
mv "$x" "${x%.*}";;
esac
done
if [ -e /etc/profile.d/cancel-on-reboot.list ]; then
# rename all files in this list so they won't be considered any longer
while read -r x; do
mv "$x" "$x.cancelled"
done </etc/profile.d/cancel-on-reboot.list
rm /etc/profile.d/cancel-on-reboot.list
fi
如果您想在一次重新启动后重新启用该设置,请将其重命名为*.sh.0
.
答案4
抱歉,您必须在某处编辑启动文件,如果您希望所有用户都使用它,则可能是bashrc
在/etc
.
但是,如果您不想使用文件的唯一原因是您希望此行为在重新启动时消失,则还有其他方法可以做到这一点:
- 从.
setvariable.bash
bashrc
在该文件中,您导出变量 - 将一个文件放入您的文件中
/etc/init.d
,该文件将在重新启动时启动并停用该setvariable.bash
文件(用空白文件或其他文件替换它)
这是一个黑客,但它可能会起作用。