첫 번째 프롬프트를 표시한 후 쉘(자동) 소스 파일을 사용할 수 있습니까?

첫 번째 프롬프트를 표시한 후 쉘(자동) 소스 파일을 사용할 수 있습니까?

혹시 방법이 있는지 알고 싶습니다내 시작 파일에 일부 콘텐츠를 추가합니다.이로 인해 다른 파일을 가져오게 됩니다.첫 번째 프롬프트가 표시된 후.

preexec나는 , precmd또는 Hooks 와 같은 periodic후크에 의존하지 않는 접근 방식을 선호합니다 . (나는 zsh를 사용하고 있지만 사람들이 영리한 해킹 trap이나 유사한 방법을 통해 bash에 추가하는 코드를 작성했다는 것을 알고 있습니다.)

매우 간단한 첫 번째 테스트(작동할 것이라고는 기대하지 않았지만 정확한 결과를 확인하기 위해 시도해 볼 필요성을 느꼈습니다)를 내 .zshrc,

{ sleep 100 && export VARIABLE_SET=1 } &

그런 다음 셸이 로드된 후 100초 전후에 이 명령을 실행합니다.

echo $VARIABLE_SET

물론 그것은(그리고 내가 생각할 수 있는 모든 순열) 실패하고 이를 수행하는 방법에 대한 유망한 단서를 제공하지 않습니다.

첫 번째 프롬프트에서 즉시 사용할 수 없더라도 시작 파일의 무언가가 셸에 영향을 미치는 소스를 트리거하기를 원합니다. 시작 파일을 부풀리는 많은 것들이 자주 필요하지 않기 때문에 "비싼" 구매를 지연하고 프롬프트가 빠르게 표시되도록 하는 방법을 찾고 싶습니다.

precmd저는 후크를 사용하는 것보다 더 간단한 방법을 찾고 싶습니다(그러나 다른 방법이 없을 경우를 대비해 후크를 사용하여 개념 증명을 만들었습니다 ).

답변1

발견한 바와 같이 백그라운드에서 명령을 실행하면 해당 명령 &이 하위 쉘에 들어가고 하위 쉘은 상위 프로세스의 변수/환경 변수를 변경할 수 없습니다. ("할 수 없다"이 문장은 다음과 같이 읽어야 합니다."해결책은 추악하다".)

source따라서 현재 셸에서 명령을 실행 해야 합니다 . 아래에 몇 가지 옵션을 나열하겠습니다.

이 중 어느 것도 귀하가 요청한 질문에 대한 완전한 답변은 아니지만 귀하가 해결하려는 실제 문제에 대한 해결책을 제공하는 것 같습니다.

zsh-defer(zsh 스크립트)

.zshrc:

# load zsh-defer:
source "$HOME/zsh-defer.plugin.zsh"

# ... misc. commands ...

# defer 'source "$HOME/file"' for later execution:
zsh-defer source "$HOME/file"

반복 호출을 통해 원하는 만큼의 명령(등)이 프롬프트될 수 있습니다 source .zshrc.2.source .zshrc.3zsh-defer

혜택:관리하기 어려운 많은 zinit엣지 케이스를 처리합니다. 더 복잡한 솔루션보다 sched.

성능: zsh-defer이 자체는 최대 몇 밀리초 내에 로드되어야 합니다.

구현하다:zle(zsh의 라인 편집기)에서 명령을 실행하십시오.

zsh zsh/sched모듈

(제안대로@StéphaneChazelas의 이전 답변)

간단하고 직접적입니다.

.zshrc:

sched +10 "source $HOME/file" &>/dev/null || source "$HOME/file"

... &>/dev/null || ...부분: sched사용할 수 없거나 오류로 인해 종료되는 경우 파일이 전혀 없는 것보다 낫다고 가정하여 즉시 파일을 가져옵니다.

세부정보 sched: 참조zsh에 대한 문서.

결점:

  • 명령을 실행하는 데 오랜 시간이 걸리면 실행하는 동안 셸이 차단됩니다.
  • Yearly check: do <evil thing>? [y/N]지연된 명령이 명령을 입력할 때 예기치 않게 사용자 입력(" ")을 요구하는 경우 실수로 입력될 위험이 있습니다.

성능:sched명령을 실행하는 데 최대 몇 밀리초가 걸릴 수 있습니다.

사용전력 레벨 10k힌트즉시 알림

.zshrc추가 작업이 필요하지 않습니다 . 처리하는 동안 원하는 작업을 .zshrc수행하면 프롬프트가 로드되어 상호 작용할 준비가 됩니다(몇 가지 주의 사항 있음).

성능:쉘이 처리를 시작한 후 약 10밀리초 이내에 프롬프트가 표시되어야 합니다 .zshrc.

구현하다:다양한 zsh 기능과 요령. 실수로 입력되지 않도록 명령을 실행할 때 stdin을 리디렉션(및 버퍼링)하는 등 특별한 주의가 필요합니다.

플러그인 관리자zinit

zinit이를 사용하여 zinit ice wait파일 가져오기와 같은 명령 실행을 지연할 수 있습니다.

zinit플러그인 관리자로 사용하지 않고 이 기능에만 사용할 수 있으며 다른 플러그인 관리자(있는 경우)를 방해하지 않습니다.

원본 버전은 zdharma/zinit더 이상 유지되지 않지만 이러한 포크는 다음과 같습니다.

장기 실행 명령이 셸을 차단할 것이라고는 생각하지 않지만 직접 테스트하지는 않았습니다.

성능:내 시스템에서는 zinit자체적으로 로드하는 데 약 10ms가 걸리거나 완료하지 않고 5ms가 걸립니다.

구현하다: zinitzsh/sched호출 시 즉시 테이블에 다시 추가되고 sched사용자가 설정한 명령을 실행하는 셸 함수를 추가하려면 다음을 사용하세요.zsh 후크및 기타 zsh 기능.

zsh-async도서관

유용할 수도 있습니다. 완전성을 위해 언급했습니다.

zsh에서 비동기 작업을 실행하기 위한 작은 범용 라이브러리입니다. 그것~ 할 것이다그러나 별도의 프로세스에서 실행하면 환경 변수가 상위 셸에 설정되지 않습니다. 결과가 상위 ​​셸에서 실행될 수 있도록 콜백 함수를 할당하면 몇 가지 간단한 해결 방법이 있다고 생각합니다.

혜택:이는 상당히 광범위하게 사용되었으며 8년 동안 적극적으로 유지 관리되었습니다.

구현하다:zsh/zpty지연된 명령 실행을 시작하는 데 사용되는 의사 터미널입니다.


추천도서

롬카 TV(저자 zsh-defer전력 레벨 10k)단계적 zsh 시작에 대한 일반적인 생각 및 제안/지연 로딩/지연 실행.

셸 로딩 성능에 대한 추가 FAQ

묻다:.zshrc더 빠르게 실행되도록 워드 코드로 컴파일할 수 있나요 ?
ㅏ:이론적으로는 가능하지만 별칭, 재컴파일 누락 등이 발생하기 쉽습니다. 권장되지 않습니다.
묻다:이제 무엇이 잘못될 수 있는지 이해합니다. 나는 아직도 이것을 시도하고 싶다.
ㅏ:아뇨, 사실은 그렇지 않습니다.

답변2

언제든지 sched추가할 수 있습니다.~/.zshrc

sched +30 'source ~/.zsh/more-stuff'

~/.zsh/more-stuff시작 후 30초 이내에(또는 30초 후 다음 프롬프트에서) 획득됩니다 .

답변3

이 아이디어를 사용할 수 없습니다. {...} &왜냐하면 &거기에 설정된 변수가 부모 쉘에 영향을 주지 않기 때문입니다.

따라서 임시 파일에 설정을 쓰고 상위 파일로 설정을 읽을 수 있습니다.

한 가지 접근 방식은 DEBUG 트랩을 사용하는 것입니다.

아직 완전히 테스트되지는 않았지만 아마도 다음과 같을 것입니다.

( sleep 100 ; echo MYVAR=1 ; echo trap - DEBUG ) > ~/.slowstartfile.$$
trap '. ~/.slowstartfile.$$' DEBUG

DEBUG 트랩은 일반적으로 명령을 실행한 후에 호출됩니다.

그래서

% ( sleep 10 ; echo MYVAR=1 ; echo trap - DEBUG ) > ~/.slowstartfile.$$ &
[1]     9411
% trap 'source ~/.slowstartfile.$$' DEBUG                           
% sleep 10
[1] +  Done                    ( sleep 10 ; echo MYVAR=1 ; echo trap - DEBUG ) > ~/.slowstartfile.$$ &
% echo $MYVAR                                                       
1

답변4

.env환경 변수를 로드할 소스 파일을 찾고 있다면도트프당신을 도울 수 있습니다.

관련 정보