.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보내 상위 셸을 종료합니다 . 사용자가 .HUPdecrypt.shencrypt.sh


HISTFILE설정 하거나 /dev/null시도하는 대신설정되지 않음생성한 대화형 셸에서 이를 HOME임시 디렉터리로 설정하기만 하면 됩니다. 기록 파일은 해당 디렉터리에 생성되며 $HOME종료 시 해당 디렉터리와 함께 삭제됩니다.decrypt.sh

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

cd이는 인수 및 이 변수를 사용할 수 있는 HOME다른 모든 것 뿐만 아니라 물결표 확장의 동작에도 영향을 미칩니다 .

덜 침해적인 변형은 변수를 HISTFILE임시 디렉터리의 파일 이름으로 명시적으로 설정하는 것입니다.

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

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

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

관련 정보