Bash

對非互動式 shell 使用 bash 而不是 tcsh

  • September 17, 2021

我有一個類似於這個問題的環境:用於互動式和非互動式工作的不同外殼

我目前堅持使用 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 伺服器基本上所做的就是呼叫userwith的登錄 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

歡迎改進(和簡化!)。

引用自:https://unix.stackexchange.com/questions/669355