Linux

在 shell 腳本中執行使用者預設 shell

  • September 8, 2020

在 shell 腳本中,我想執行使用者 shell 並在 shell 完成後繼續執行腳本。

它應該看起來像這樣:

> myScript.sh
Script ouput
> echo "shell started by myScript.sh"
shell started by myScript.sh
> exit
More script output
>

它在我在腳本中執行 shell 時起作用:

echo "Script output"
bash
echo "More script output"

但我希望它不要使用固定的外殼。使用者登錄 shell 或他在啟動 myScript.sh 之前所在的 shell 應該沒問題。

任何解決方案都必須不僅適用於基於 Linux 的系統,而且適用於 Mac OSX

初始登錄 shell 保存在 passwd 數據庫中,因此您可以按照$(getent passwd myusername | cut -d: -f7). 請注意,如果我通常使用zsh,但目前在 a 中bash並執行它,我將得到 azsh而不是 a bash,這可能是也可能不是你想要的?

環境變數$$是指目前的PID。我們可以將它與 ‘ps’ 一起使用來查找目前 shell:

ps --no-header -o args -p $$ | cut -d- -f2

上面應該返回你想要的,修剪可能存在的前導。例如:

THESHELL=`ps --no-header -o args -p "$$" | cut -d- -f2`
start_another_shell() {
   "$THESHELL"
}
echo "The shell is $THESHELL"
start_another_shell
echo "Bye!"

確保使用“源”執行它,以避免意外地對自己進行 forkbombing。例如:

me@here$ source myScript
The shell is bash
me@here$ exit
Bye!
$ zsh
$ source myScript
The shell is zsh
$ exit
Bye!

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