非交互模式下的 Bash 环境变量

非交互模式下的 Bash 环境变量

我正在尝试在 Raspbian 中为非交互式控制台定义环境变量。

理论上,我需要将变量添加到 ~/.bashrc 或 ~/.profile 或 /etc/bash.bashrc 或 /etc/profile 中。例如,我添加此行(根据我添加它的文件):

export VTEMP="set on ~/.bashrc"
export VTEMP="set on ~/.profile"
export VTEMP="set on /etc/bash.bashrc"
export VTEMP="set on /etc/profile"

如果我在所有文件中写入此行并通过 ssh 记录,然后输入命令: echo $VTEMP return: set on ~/.profile

如果我转到树莓派,打开一个 LXTerminal 并输入这些命令 echo $VTEMP return: set on ~/.bashrc

但是,如果我尝试使用 ssh 进行非交互式远程操作,写入:,当我查看文件 out.txt 的内容时,什么也没有,它是空的。ssh [email protected] "echo $VTEMP > out.txt"

为什么在使用非交互式时不定义 VTEMP?

答案1

简答

尝试显式获取 rc 文件(并使用单引号):

ssh [email protected] 'source ~/.bashrc; echo $VTEMP > out.txt'

解释

这里有两个问题。首先,存在在什么情况下获取哪个 rc(运行命令)文件的问题。其次,存在向 ssh 传递什么命令的问题。

关于第一个问题,非交互式 Bash shell 都不会执行~/.profile~/.bashrc一般来说,您可能需要BASH_ENV在调用非交互式脚本时考虑使用环境变量。 Bash 手册对此进行了描述:

以下帖子也讨论了这个问题,您可能需要查阅:

不幸的是,这可能不适用于执行非交互 ssh 命令的情况 - 请参阅以下帖子以进行进一步讨论:

因此,对您来说最好的解决方案可能是不依赖于 rc/profile 文件之一的自动来源,而只是自己显式运行所需的脚本,例如source ~/.bashrc在运行之前运行echo $VTEMP > out.txt

最后,您的命令使用双引号而不是单引号,这意味着您的$VTEMP变量正在本地而不是远程进行评估 - 您应该使用单引号。将所有这些放在一起,我们得到以下解决方案:

ssh [email protected] 'source ~/.bashrc; echo $VTEMP > out.txt'

答案2

您的输出为空,因为您忘记转义该命令。它应该是:

ssh [email protected] 'echo $VTEMP > out.txt'

否则 的值$VTEMP将被您的 shell 替换本地由于您没有在本地计算机上定义它,因此它不会打印任何内容。

相关内容