从 .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 退出时进行清理):

免责声明:我写的。

相关内容