바인딩을 설정할 수 있으면서도 사용자 구성 없이 bash 실행

바인딩을 설정할 수 있으면서도 사용자 구성 없이 bash 실행

다음 두 가지 속성을 사용하여 스크립트를 실행하고 싶습니다.

  1. 스크립트의 모든 내용은 마치 bashrc를 얻지 못한 것처럼 실행됩니다.
  2. 스크립트가 완료된 후에도 유지되는 바인딩을 설정할 수 있습니다.

예를 들어, 내 .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.shrm별칭을 사용합니다.

답변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~/.bashrcdeclarealiasmy-script.shsourcealiasdeclare
스티븐 차제라스 지적) 소스 콘텐츠는 별칭 확장을 거치게 되며 이로 인해 이 연습의 전체 요점이 무산될 수 있습니다.
또한 명령줄(예: 의 출력 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.

관련 정보