다음 두 가지 속성을 사용하여 스크립트를 실행하고 싶습니다.
- 스크립트의 모든 내용은 마치 bashrc를 얻지 못한 것처럼 실행됩니다.
- 스크립트가 완료된 후에도 유지되는 바인딩을 설정할 수 있습니다.
예를 들어, 내 .bashrc가 다음과 같다면
alias rm="echo don't use me"
다음 스크립트를 실행할 수 있기를 원합니다.
rm.me
제거됨- 그 후 실행하면
fn
에코가 발생합니다.i am bound
rm rm.me
fn() { echo i am bound; }
을 실행하면 bash my-script.sh
바인딩 fn
되지 않고
, 실행하면 . my-script.sh
내 rm
별칭을 사용합니다.
답변1
스크립트를 가져올 때 언제든지 별칭 확장을 비활성화할 수 있습니다.
shopt -u expand_aliases; . ./myscript.bash; shopt -s expand_aliases
( myscript.bash
설정한 변수, 함수, umask, 제한, 트랩, 리디렉션, 옵션 등은 계속 상속됩니다 ~/.bashrc
.)
답변2
제가 아는 한, 외부 쉘 실행 환경에서 변경된 사항을 현재 쉘 실행 환경에 자동으로 적용할 수 있는 방법은 없습니다.
다음은 my-script.sh
스크립트를 변경하지 않고 이 작업을 부분적으로 수행하는 방법에 대한 개념 증명입니다.
{ . <(bash <(cat my-script.sh - <<'EOT'
declare -pf >&3
alias -p >&3
EOT
) 3>&1 1>&4); } 4>&1
이런 방식으로 의 내용은 별칭과 내보내지 않은 변수 및 함수를 소스로 사용하거나 상속받지 my-script.sh
않는 자체 지연 인스턴스에서 실행됩니다 . 해당 환경의 별칭과 함수 정의를 인쇄하려면 여기에 연결하세요 . 파일 설명자 셔플링을 사용하면 출력이 외부 표준 출력(기본적으로 터미널)에 인쇄되는 반면, 명령은 추가된 sum 의 출력 만 제공합니다 . 참고하세요(예:bash
~/.bashrc
declare
alias
my-script.sh
source
alias
declare
스티븐 차제라스 지적) 소스 콘텐츠는 별칭 확장을 거치게 되며 이로 인해 이 연습의 전체 요점이 무산될 수 있습니다.
또한 명령줄(예: 의 출력 ps
)과 하위 Bash 프로세스(예: 오류 메시지 인쇄 시)의 명령 이름은 거의 의미가 없습니다. 프로세스는 자신이 생성한 임시 파일의 경로를 대체합니다.
또는 현재 환경의 일부를 임시로 저장하고 삭제한 후 스크립트를 가져온 다음 삭제된 부분을 복원할 수 있습니다. 별칭의 경우:
aliases=$(alias -p)
unalias -a
. my-script.sh
eval "$aliases"
기능의 경우:
shopt -s extglob # (There likely
functions=$(declare -pf) # is a cleaner
readarray -t funcnames < <(declare -pF) # way to
unset -f "${funcnames[@]#declare -f*(x) }" # do this)
. my-script.sh
eval "$functions"
다시 말하지만, 를 사용하면 의 내용이 functions
별칭으로 확장된다는 점에 유의하는 것이 중요합니다 eval
.