为什么可以';我不能在Ruby脚本中访问bash提示符吗?

为什么可以';我不能在Ruby脚本中访问bash提示符吗?,ruby,bash,Ruby,Bash,在我的.bash\u档案中我有: if [ -f $(brew --prefix)/etc/bash_completion ]; then source $(brew --prefix)/etc/bash_completion GIT_PS1_SHOWDIRTYSTATE=1 git_prompt='$(__git_ps1)' fi export PS1="\[\e[33m\] \d \t \w$git_prompt\n\[\e[m\]\\$ " export MYTESTVAR=

在我的
.bash\u档案中
我有:

if [ -f $(brew --prefix)/etc/bash_completion ]; then
  source $(brew --prefix)/etc/bash_completion
  GIT_PS1_SHOWDIRTYSTATE=1
  git_prompt='$(__git_ps1)'
fi
export PS1="\[\e[33m\]  \d \t \w$git_prompt\n\[\e[m\]\\$ "
export MYTESTVAR="hello world"
我有一个Ruby脚本
foo.rb
,它包含:

`source ~/.bash_profile`
puts `printenv`
puts `echo $PS1`
puts `echo $MYTESTVAR`
运行
ruby foo.rb
时,
printenv
命令列出所有环境变量,
$MYTESTVAR
行正确返回
hello world

但是,
$PS1
不会显示。为什么会这样

$MYTESTVAR行正确返回hello world。 $PS1未显示

事实上,你是对的。大多数变量工作正常,但“PS1”尤其不起作用:

$ PS1=ps1 TEST1=test1 ruby -e 'puts `echo $PS1 and $TEST1`'
and test1
为什么会这样

您可能知道,在Ruby中,
`somestring`
在shell中执行
somestring
,就好像您在C中打开了一个管道,指向
execl(“/bin/sh”、“-C”、somestring、NULL)

在许多系统上,
/bin/sh
bash
提供。Bash中有以下代码段:

换句话说,它显式删除了“PS1”和“PS2”,因为这些变量仅用于交互式shell

在由
dash
提供
/bin/bash
的其他系统上,许多基于Debian的现代发行版默认为,您反而会得到预期的结果:

$ PS1=ps1 TEST1=test1 ruby -e 'puts `echo $PS1 $TEST1`'
ps1 and test1
您的
`source~/.bash_概要文件`
无法解决此问题的原因是每个
`backtick命令`
都在单独的shell中运行。其中一个中设置的变量不会反映在另一个中

如果您只想让shell导出变量,那么应该按照@anujm的建议,直接使用
ENV['PS1']
获取它。这不仅更简单、更健壮,而且速度快了一千倍

如果希望变量在
.bash\u配置文件中设置,则无论脚本如何运行,都可以在同一个shell中执行寻源和打印操作:

puts `bash -c 'source ~/.bash_profile; printf "%s" "$PS1"'`

但它比这更复杂,因为涉及到五个独立的过程,每个过程都有自己的环境。我没有理解这一部分。更新。
puts `bash -c 'source ~/.bash_profile; printf "%s" "$PS1"'`