シェルスクリプトでユーザーのデフォルトシェルを実行する

シェルスクリプトでユーザーのデフォルトシェルを実行する

シェルスクリプトでユーザーシェルを実行し、シェルが完了した後にスクリプトを実行し続けたいと思います。

次のようにする必要があります。

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

スクリプトからシェルを実行すると機能します。

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

しかし、固定シェルを使用しないことを願っています。ユーザーのログインシェルまたはmyScript.shを起動する前のシェルは問題ありません。

すべてのソリューションはLinuxベースのシステムだけでなく、Mac OSXでも動作するはずです。

答え1

$SHELL環境変数を使用できます(設定されている場合)。

echo "Script output"
"${SHELL-bash}"
echo "More script output"

この場合、設定されていない場合はコードが呼び出されますbash

有効な実行ファイルを指していることを確認していません。誰かがそれを操作すると他のアプリケーションにも影響を与えると仮定しましたが、フルパスである必要があるため、このタイプのアプローチを使用できます。テスト)

[ -n "$SHELL" ] && [ -x "$SHELL" ] || SHELL=
"${SHELL-bash}"

答え2

初期ログインシェルはpasswdデータベースに保存されているため、従うことができます$(getent passwd myusername | cut -d: -f7)。通常、aを使用しているがzsh現在aにある場合、bashそれを実行するとaのzsh代わりにaが表示されますbash。これは望むものでも、そうでないかもしれません。

答え3

環境変数は$$現在のPIDを表します。これを「ps」と一緒に使用して現在のシェルを見つけることができます:

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!"

誤ってフォーク爆撃を受けないようにするには、「ソース」を使用して実行してください。たとえば、

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

関連情報