Создать новую оболочку bash из скрипта .sh

Создать новую оболочку bash из скрипта .sh

В качестве последней команды моего 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завершит свою родительскую оболочку, когда сам выйдет, отправив ей сигнал HUP, побуждающий decrypt.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 )

Немного похоже: Инструмент, который использует некоторые из этих вещей (создает интерактивную оболочку во временном рабочем каталоге в чистой среде, с очисткой при выходе из оболочки):

Отказ от ответственности: это написал я.

Связанный контент