.sh スクリプトから新しい bash シェルを作成する

.sh スクリプトから新しい bash シェルを作成する

スクリプトの最後のコマンドとしてdecrypt.sh、 で新しく作成されたフォルダーに新しいシェルを作成したいと思いますunset HISTFILE

この時点で、ユーザーはこの新しいシェルを操作できるはずです。

このフォルダには、ユーザーが実行できるスクリプトが入っていますencrypt.sh。最後のアクションとして、フォルダを削除してこのシェルを終了し、ユーザーを元のシェルに戻す必要があります。

どうすればこれを実現できるでしょうか?

bash ソリューションは私にとっては便利ですが、汎用ソリューションは他の人にとって便利かもしれません (ただし、不可能かもしれません)。

答え1

スクリプトdecrypt.sh

#!/bin/bash

# Create working directory.
tmpdir=$(mktemp -d)

# Remove the temporary directory upon exiting
trap 'rm -r "$tmpdir"' EXIT

# Copy "encrypt.sh" from somewhere.
cp /somewhere/encrypt.sh "$tmpdir"

# Start an interactive shell in the directory with
# HISTFILE set to /dev/null
( cd "$tmpdir" && HISTFILE=/dev/null bash )

スクリプトencrypt.sh

#!/bin/bash

# When exiting, terminate the parent shell
trap 'kill -s HUP "$PPID"' EXIT

# rest of script goes here

スクリプトdecrypt.shは作業ディレクトリの設定と削除を行います。ディレクトリの設定には、ディレクトリの作成 (を使用してmktemp -d一時ディレクトリを作成する) と、encrypt.sh元のディレクトリがある場所からスクリプトをそのディレクトリにコピーすることが含まれます。作業ディレクトリの削除は、decrypt.shスクリプトが終了したときに行われます。

スクリプトencrypt.shは、自身が終了するときにシグナルを送信して親シェルを終了しHUPdecrypt.shスクリプトに作業ディレクトリを削除するように指示します。ユーザーが を実行せずに対話型シェルを終了した場合も、ディレクトリは削除されますencrypt.sh


HISTFILE設定したり/dev/null、試みる代わりに設定解除作成された対話型シェルでそれを実行するには、一時ディレクトリに設定するだけですHOME。履歴ファイルはその下に作成され$HOME、終了時にディレクトリとともに削除されますdecrypt.sh

( cd "$tmpdir" && HOME="$tmpdir" bash )

これは、チルダ展開の動作、cd引数なしの動作、およびHOME変数を使用している可能性のあるその他の動作に影響することに注意してください。

より影響の少ないバリエーションとしては、HISTFILE変数を一時ディレクトリの下のファイル名に明示的に設定する方法があります。

( cd "$tmpdir" && HISTFILE="$tmpdir/.bash_history" bash )

少し関連していますが、これらのいくつかを使用するツール (クリーンな環境の一時作業ディレクトリに対話型シェルを作成し、シェルの終了時にクリーンアップを実行します)。

免責事項:これは私が書いたものです。

関連情報