Shell

在沒有 chsh 或管理員權限的情況下更改預設 shell

  • September 1, 2018

我在這個執行緒中看到了以下片段:如何從 csh 更改為 bash 作為預設 shell

sleep 2
if (-x /usr/local/bin/bash) then
 exec /bin/sh -c '. ~/.profile; exec /usr/local/bin/bash'
endif

我的理解是,如果您將此程式碼​​段放入~/.login其中,它將bash在您登錄時呼叫。

我有類似的情況,我想使用類似的程式碼段來呼叫zsh與我登錄時使用的預設版本不同的版本。我遇到這個麻煩的部分原因是因為我無法選擇zsh中允許的選項中我想要的版本chsh,並且我沒有管理員權限。

有了這個:

  • 在不同版本的 zsh 之間切換時,我將如何更改上面的程式碼片段來執行此操作?
  • 為什麼上​​面的程式碼片段需要兩個exec命令?他們在做什麼?另外,為什麼上面的程式碼段使用sh and bash(使用者應該使用 登錄csh

如果要執行 zsh 而不是 bash,只需替換為執行檔/usr/local/bin/bash的路徑即可。zsh請注意,此程式碼段特定於 csh;如果您的登錄 shell 不是 (t)csh,則此程式碼~/.login不會為您做任何事情。

至於為什麼要以這種方式編寫程式碼段,您必須詢問編寫它的人。*$$ Checks who that was. $$*哦。好吧,如果您只是這樣做,exec /usr/local/bin/bash那麼您將不會啟動登錄 shell,因此您.profile將不會被執行。但這可以通過執行以更簡單的方式解決/usr/local/bin/bash --login

現在,如果您的登錄 shell 不是 csh,您將需要一個不同的片段exec。在 Bourne 風格的 shell 中,包括 zsh:

if [ -x ~/bin/zsh ]; then exec ~/bin/zsh; fi

如果exec ~/bin/zsh -l您希望 zsh 的新實例讀取您的~/.zprofile. 請注意,如果您這樣做,上面的程式碼段必須在您的.profileor中.bash_profile;如果您的登錄 shell 是 zsh,請不要將程式碼段放入您.zprofileexec.

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