シェルスクリプトでユーザーシェルを実行し、シェルが完了した後にスクリプトを実行し続けたいと思います。
次のようにする必要があります。
> 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!