내 zsh 스크립트가 아무것도 에코하지 않는 이유는 무엇입니까? [복사]

내 zsh 스크립트가 아무것도 에코하지 않는 이유는 무엇입니까? [복사]

스크립트:

#!/bin/zsh

IFS=$'\n' arr=($(alias | grep 'git' | grep "^[g|\'g]" | sed 's/=.*//' | sed "s/'//"))

echo $arr

이 두 줄은 일반 명령줄에서 작동합니다.

~/test ·····································································································································  test-Cj2sK_tx
❮ IFS=$'\n' arr=($(alias | grep 'git' | grep "^[g|\'g]" | sed 's/=.*//' | sed "s/'//"))

~/test ·····································································································································  test-Cj2sK_tx
❯ echo $arr
g ga gaa gam gama gamc gams gamscp gap gapa gapt gau gav gb gbD gba gbd gbda gbl gbnm gbr gbs gbsb gbsg gbsr gbss gc gc!' gca gca!' gcam gcan!' gcans!' gcas gcasm gcb gcd gcf gcl gclean gcm gcmsg gcn!' gco gcount gcp gcpa gcpc gcs gcsm gd gdca gdct gdcw gds gdt gdw gf gfa gfg gfo gg gga ggpull ggpush ggsup ghh gignore gignored git-svn-dcommit-push gk gke gl glg glgg glgga glgm glgp glo glod glods glog gloga glol glola glols glp glum gm gma gmom gmt gmtvim gmum gp gpd gpf gpf!' gpoat gpristine gpsup gpu gpv gr gra grb grba grbc grbd grbi grbm grbo grbs grev grh grhh grm grmc grmv groh grrm grs grset grss grst grt gru grup grv gsb gsd gsh gsi gsps gsr gss gst gsta gstaa gstall gstc gstd gstl gstp gsts gsu gsw gswc gtl gts gtv gunignore gunwip gup gupa gupav gupv gwch gwip

그런데 이 두 명령어가 스크립트 파일에 있으면 동작하지 않네요...

~/test ·····································································································································  test-Cj2sK_tx
❯ /bin/zsh ./d-alias.sh
# nothing here...

도움을 주셔서 감사합니다. 매우 감사합니다.

답변1

원하는 작업을 수행하는 더 쉬운 방법이 있습니다.

print -r -- ${(k)aliases[(R)*git*]}

그러나 주요 문제의 경우 이 작업을 수행하면 /bin/zsh ./d-alias.sh스크립트를 실행하기 위해 새 셸을 시작하기 때문에 작동하지 않습니다. 다른 셸에서 새 셸을 시작하면 새 셸은 원래 셸에서 내보낸 환경 변수를 상속하지만 다른 것은 상속하지 않습니다. 또한 단순히 새 셸을 시작하는 것이 아니라 스크립트나 명령을 실행하기 위해 새 셸을 시작하는 경우 대화형으로 간주되지 않습니다. 이는 .zshrc소스를 얻을 수 없으므로 별칭이 초기화되지 않음을 의미합니다.

해결책은 스크립트를 함수로 로드하는 것입니다.

% mkdir -p ~/Functions
% print 'print -r -- ${(k)aliases[(R)$~1]}' >> ~/Functions/d-alias
% fpath+=( ~/Functions )
% autoload -Uz d-alias
% d-alias '*git*'
g ga gaa gam gama gamc gams gamscp gap gapa gapt gau gav gb gbD gba gbd gbda gbl gbnm gbr gbs gbsb gbsg gbsr gbss gc gc!' gca gca!' gcam gcan!' gcans!' gcas gcasm gcb gcd gcf gcl gclean gcm gcmsg gcn!' gco gcount gcp gcpa gcpc gcs gcsm gd gdca gdct gdcw gds gdt gdw gf gfa gfg gfo gg gga ggpull ggpush ggsup ghh gignore gignored git-svn-dcommit-push gk gke gl glg glgg glgga glgm glgp glo glod glods glog gloga glol glola glols glp glum gm gma gmom gmt gmtvim gmum gp gpd gpf gpf!' gpoat gpristine gpsup gpu gpv gr gra grb grba grbc grbd grbi grbm grbo grbs grev grh grhh grm grmc grmv groh grrm grs grset grss grst grt gru grup grv gsb gsd gsh gsi gsps gsr gss gst gsta gstaa gstall gstc gstd gstl gstp gsts gsu gsw gswc gtl gts gtv gunignore gunwip gup gupa gupav gupv gwch gwip

답변2

별칭은 어디에 정의되어 있나요?

./name.zsh로 스크립트를 실행하면 현재 셸의 분기된 복사본이 아닌 새로운 zsh 복사본이 실행됩니다. zsh의 새 복사본은 ~/.zshrc의 소스가 되지만 로그인 쉘이 아니기 때문에 ~/.zprofile 또는 ~/.profile의 소스는 아닙니다. 편집: 아래에 언급된 Kusalananda와 같이 스크립트에 대해 ~/.zshrc를 소스하지 않으며 ~/.zshenv만 zsh 스크립트를 소스로 사용합니다.

파이프, 루프, $() 및 함수는 현재 셸의 분기로 실행되고 모든 별칭과 함수를 유지하므로 '$(alias)'는 현재 별칭과 함수를 상속하고 'zsh -c alias'는 현재 별칭과 함수를 상속합니다. 아니다. 또한 쉘 스크립트를 실행하면 현재 쉘을 포크하는 대신 항상 "zsh -c alias"와 같은 스크립트에 대한 새 프로세스가 생성됩니다.

이것을 현재 셸로 가져오면 작동합니다.

. ./name.zsh

별칭이 ~/.zprofile 또는 ~/.profile에 정의된 경우 해당 별칭을 ~/.zshrc로 이동해야 합니다. 이는 로그인 셸뿐만 아니라 zsh의 모든 복사본에서 발생합니다.

관련 정보