作为脚本的最后一个命令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 退出时进行清理):
免责声明:我写的。