2016-05-23 55 views
1

在我.bash_profile我:爲什麼我不能在Ruby腳本中訪問我的bash提示符?

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.rbprintenv命令列出所有的環境變量,而$MYTESTVAR線正確返回hello world

但是,$PS1沒有顯示出來。爲什麼是這樣?

回答

3

$ 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/shbash提供。 Bash有這個片段在its initialization code

/* Execute the start-up scripts. */ 

    if (interactive_shell == 0) 
    { 
     unbind_variable ("PS1"); 
     unbind_variable ("PS2"); 
     interactive = 0; 

換句話說,它明確刪除「PS1」及「PS2」,因爲這些變量僅用於與交互式shell使用。

在其他系統中/bin/bashdash提供,因爲許多現代基於Debian的發行版默認爲,而是你得到你所期望的結果:

$ PS1=ps1 TEST1=test1 ruby -e 'puts `echo $PS1 $TEST1`' 
ps1 and test1 

爲什麼你`source ~/.bash_profile`不能解決這是什麼原因每個`backtick command`運行在一個單獨的shell。其中一個變量不會反映在另一個變量中。

如果你只是想要你的shell導出的變量,你應該做@anujm建議並直接用ENV['PS1']得到它。這不僅更簡單,更強大,而且速度也快了上千倍。

如果你想在變量作爲您.bash_profile設置,無論你如何運行腳本,你可以在同一個外殼都採購和印刷:

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

但它是比這更復雜,因爲那裏涉及五個獨立的流程,每個流程都有自己的環境。 –

+0

我沒有抓到那部分。更新。 –

相關問題