Bash
對非互動式 shell 使用 bash 而不是 tcsh
我有一個類似於這個問題的環境:用於互動式和非互動式工作的不同外殼
我目前堅持使用 tcsh 作為我的“官方”預設 shell。對於互動式 shell,我基本上
exec /bin/bash
來自我的~/.login
文件。有沒有辦法讓 bash 成為非互動式 shell 的 shell?即,如果我這樣做
ssh myserver env
,它會列印出 shell 是/bin/tcsh
. 我在看,~/.cshrc
我看到我可以在哪裡放一些東西來做這個,但我不知道放什麼。或者也許有一個不同的地方可以放置這樣的東西?目前,如果我
exec /bin/bash
來自~/.cshrc
非互動式 shell,上述 ssh 命令將掛起(可能是因為它試圖從非互動式 shell 執行互動式 shell)。甚至可以做我想做的事嗎?
如果您的遠端電腦是 Linux,請嘗試將其添加到您的
~/.tcshrc
:if ($?SSH_CONNECTION && $shlvl == 1) then set sh = /bin/bash set cmdline = "`tr '\0\n' '\n\1' </proc/$$/cmdline`" if ($#cmdline > 2) then exec $sh -c 'exec "$0" -c "$(printf %s "$1" | tr "\1" "\n")"' $sh $cmdline[3]:q endif endif
當您呼叫
ssh user@host cmd
時,ssh 伺服器基本上所做的就是呼叫user
with的登錄 shell-c
並將cmd
其作為參數傳遞給它。如果您只exec /bin/bash
從您的~/.cshrc
.bash 中呼叫,則將不帶參數呼叫 bash,並希望從其標準輸入中讀取命令,這意味著ssh user@host cmd
在您按 Ctrl-C 或 Ctrl-D 之前,它似乎“掛起”。上面的 kludge 嘗試從中獲取
cmd
參數/proc/<pid>/cmdline
,然後/bin/bash
以相同的方式呼叫您的選擇 shell ( ),-c
並將cmd
其作為參數傳遞給它。它**假定\1
.cmd
**這和大多數複雜性都來自試圖cmd
在歡迎改進(和簡化!)。