서브 쉘이 부모 쉘에서 무언가를 실행할 수 있습니까?

Aug 20 2020

source현재 환경에서 여러 환경 변수를 설정하는 것이 목적이기 때문에 d 여야하는 쉘 스크립트가 있습니다.

나중에 잊어 버리면 스크립트는 다음으로 시작합니다.

#!/usr/bin/env bash

mustBeSourced() {
  >&2 echo "This script must be sourced."
  exit 1
}

(return 0 2>/dev/null) || mustBeSourced

정기적으로 사용하는 많은 스크립트에서 이러한 상황이 자주 발생합니다. 어떤 스크립트를 소싱해야하는지 기억해야 할 필요성과 내가 잊었을 때의 작은 얼굴 손바닥 순간을 기억할 필요가 없습니다.

사용자에게 스크립트를 소싱하도록 지시하는 대신 스크립트를 호출하는 쉘 에 스크립트를 소싱하도록 지시하는 방법이 있습니까?

내 호출 쉘은 일반적으로 zsh이지만 zsh에서 가능하지 않은 경우 bash 또는 dash와 호환되는 솔루션을 수락합니다. 스크립트는 현재 bash 스크립트로 작성되어 있지만 원하는 것을 수행 할 수 있다면 다른 셸 (또는 셸이 아닌 shebang 호환 언어)로 변경하는 데 문제가 없습니다.

나는 이것이 가능하지 않다는 직감이 있습니다. 적어도 심각한 헛소리 없이는 아닙니다.

답변

2 StéphaneChazelas Aug 21 2020 at 00:28

를 사용하면 zsh접미사 별칭을 사용할 수 있습니다 (자세한 내용 info zsh alias은 참조).

alias -s zshenv=source

당신이 호출 할 때 있는지 확인하려면 some-file.zshenv, source some-file.zshenv대신에 실행됩니다.

실행 가능한 코드를 부모 프로세스에 삽입하는 것은 디버거를 사용하여 가능할 수 있지만 거기에 가고 싶지는 않습니다.