從 .sh 腳本建立新的 bash shell

從 .sh 腳本建立新的 bash shell

作為腳本的最後一個命令decrypt.sh,我希望它在新創建的資料夾中創建一個新的 shell,擴展名為unset HISTFILE.

此時,使用者應該能夠與這個新 shell 進行互動。

該資料夾中將包含encrypt.sh一個使用者可以執行的腳本。最後一個操作,它必須刪除該資料夾並退出此 shell,將使用者返回到原始 shell。

我怎樣才能做到這一點?

雖然 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會透過向其發送訊號來終止其父 shell HUP,提示decrypt.sh腳本刪除工作目錄。如果使用者退出互動式 shell 而不運作encrypt.sh.


而不是設定HISTFILE/dev/null嘗試未設定在建立的互動式 shell 中,您只需將其設定HOME為臨時目錄即可。歷史檔案會在目錄下創建,退出$HOME時會與目錄一起刪除:decrypt.sh

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

請注意,這會影響波形符擴展的行為以及不帶參數的行為cd以及可能使用該HOME變數的任何其他內容。

侵入性較小的變體是將變數明確設定HISTFILE為臨時目錄下的檔案名稱:

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

稍微相關:使用其中一些東西的工具(在乾淨環境中的臨時工作目錄中建立互動式 shell,並在 shell 退出時進行清理):

免責聲明:我寫的。

相關內容