2014-03-27 59 views
5

是否可以運行新的zshbash外殼,並在命令行中設置定製的PS1?它應該分別覆蓋由.bashrc.zshrc設置的默認主題。以定製命令行方式運行新的zsh和bash shell

我談論類似zsh --myprompt="yes master? >"

編輯: 我不想影響任何用戶端配置文件。我希望它適用於任何具有任何配置的用戶。

回答

-1

會不會export PS1='yes master? >' zsh/bash工作?

我看不出有什麼理由不應該是如此簡單,但實現什麼你

+0

嗯,我不知道爲什麼,但它確實有效。我正在使用Python的函數來設置子環境,但是它會被覆蓋。當嘗試這種方法它只是工作,沒有覆蓋兒童配置,耶:) –

+1

這*不*工作。刪除關鍵字'export',如果用戶的配置文件不改變'PS1'的值,它可能會失效。 – chepner

+0

@chepner:對!我在終端測試中感到困惑。它不適用於子進程。它只是將值輸出到當前shell中。 –

0

任何你做的命令行很可能是您的配置文件被覆蓋。你需要稍微修改相應的文件使用類似

# *After* you make any changes to PS1 
if [[ -n $MY_PS1 ]]; then 
    PS1=$MY_PS1 
fi 

如果你調用shell作爲

MY_PS1='yes master? > ' bash # or zsh 

然後MY_PS1將被用來代替無論是在.{bash,zsh}rc配置。

+0

好的,謝謝,它確實應該工作,但我需要一個解決方案,這將適用於任何**用戶,而不會影響用戶配置文件 - 這可能嗎?我將這個約束添加到了問題中。 –

+0

你可以使用'PS1 ='...'bash --norc --noprofile'來完全關閉任何配置文件處理('zsh'有類似的選項),這將阻止任何進一步修改PS1超出你指定,但這也可能會關閉很多其他配置。 – chepner

2

創建您自己的「墊片」rc文件,供用戶使用,然後用--rcfile選項(用於bash)或--rcs選項(用於zsh)調用該文件。這應該首先獲取用戶的rc文件。例如,我們稱之爲/usr/local/share/.fancypromptrc。在bash,這可能是這樣的:

source "$HOME/.bashrc" 
export PS1="DOLLAZ $" 

而在此zsh的可能看起來像:

source "${ZDOTDIR:-$HOME}/.zshrc" 
export PS1="DOLLAZ $" 

然後用戶將與bash --rcfile /usr/local/share/.fancypromptrc啓動慶典。在zsh中,它將是zsh --rcs /usr/local/share/.fancypromptrc

這樣用戶不必修改他們的rc文件,如果他們已經設置PS1,它仍然會被替換。我唯一能想象到的是,如果他們有一個PROMPT_COMMAND來覆蓋PS1或類似的東西的話。

+0

謝謝!這與我的答案很相似。如果我正確地獲取了所有內容,那麼在執行帶有「--rcs」選項的shell時,shell不會首先加載用戶選項?在這種情況下,我會堅持我的解決方案,但感謝您解決問題! :)另外我jsut在示例文件上做了調試,我不知道爲什麼,但是子shell沒有使用'--rcs'指向的文件。 –

+0

您仍然需要從您的shim rcfile中獲取用戶的.bashrc/.zshrc,就像上面的例子。你使用的是什麼版本的zsh? –

+0

我的系統上的zsh版本是5.0.5。 –

0

我找到了答案。我們應該創建一個自定義配置文件目錄,像.zshrc

source $ZDOTDIR_ORIG/.zshrc 
export PS1="[x] "$PS1 

,然後使用腳本來執行子shell記住ZDOTDIR變種的原始值下ZDOTDIR_ORIG名,這樣pseudopythoncode:

if os.environ.has_key('ZDOTDIR'): 
    zdotdir = os.environ['ZDOTDIR'] 
else: 
    zdotdir = os.path.expanduser('~') 

os.environ["ZDOTDIR"] = shellConfPath 
os.environ["ZDOTDIR_ORIG"] = zdotdir 

然後執行shell。它將使用ZDOTDIR目錄中的配置文件。