我正在尝试在 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 替换本地由于您没有在本地计算机上定义它,因此它不会打印任何内容。