.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는 신호를 보내 스크립트 자체가 종료될 때 상위 쉘을 종료하고 작업 디렉토리를 제거하라는 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 )

약간 관련됨: 다음 중 일부를 사용하는 도구(깨끗한 환경의 임시 작업 디렉터리에 대화형 셸을 생성하고 셸이 종료될 때 정리됨):

면책 조항 : 나는 그것을 썼습니다.

관련 정보