zsh에서 일부 별칭을 동적으로 선언하는 방법은 무엇입니까?

zsh에서 일부 별칭을 동적으로 선언하는 방법은 무엇입니까?

다양한 코딩 프로젝트 간에 전환하기 위한 몇 가지 바로 가기 명령을 선언하고 싶었기 때문에 다음 스크립트를 생각해냈습니다.

projects=$(ls -d ~/Workspace/*/)
prefix="/Users/myuser/Workspace/"
for f in $projects
do
        temp=${f#$prefix}
        temp=${temp/%\//}
        c="alias $temp='cd $f'"
        echo $c
        eval $c
done

내 홈 폴더의 파일에 넣어두면 .workspace-shotcuts.sh좋습니다 chmod +X .workspace-shotcuts.sh. 내가 그것을 실행할 때, 나는 ./.workspace-shotcuts.sh얻는다.

alias project1='cd /Users/myuser/Workspace/project1/'
alias project2='cd /Users/myuser/Workspace/project2/'

콘솔에서. 그러나 별칭은 선언되지 않았습니다( zsh: command not found: project1).

.zshrc또한 내가 추가한 파일 끝에는 /bin/sh .workspace-shotcuts.sh동일한 출력이 제공되지만 여전히 별칭은 없습니다.

내가 무엇을 놓치고 있는지 말해 줄 수 있는 사람이 있나요? 나는 좋은 *nix 사용자가 아니라는 점을 지적하고 싶습니다. 따라서 ELI5 관련 사항에 대해 저에게 문의하셔야 할 수도 있습니다.

편집하다:

대신 을 사용하라는 조언을 받았지만 source이를 수행했지만 다음과 같은 오류 메시지가 표시됩니다.

(eval):2: permission denied: /Users/myuser/Workspace/project1/
(eval):3: permission denied: /Users/myuser/Workspace/project2/    
(eval):4: permission denied: /Users/myuser/Workspace/project3/
(eval):5: permission denied: /Users/myuser/Workspace/project4/
(eval):6: permission denied: /Users/myuser/Workspace/project5/
(eval):7: permission denied: /Users/myuser/Workspace/project6/
(eval):8: permission denied: /Users/myuser/Workspace/project7/
(eval):9: no such file or directory: /Users/myuser/Workspace/project1=cd /Users/myuser/Workspace/project1/\n/Users/myuser/Workspace/project2/\n/Users/myuser/Workspace/project3/\n/Users/myuser/Workspace/project4/\n/Users/myuser/Workspace/project5/\n/Users/myuser/Workspace/project6/\n/Users/myuser/Workspace/project7/

뭐가 문제 야? 내 스크립트에 특별한 권한을 부여해야 합니까?

답변1

문제 중 하나는 상위 셸에 영향을 주지 않는 별도의 셸 프로세스에서 코드 조각을 실행한다는 것입니다. 이것은 에서와 같은 문제입니다.쉘 스크립트에서 "내보낸" 환경 변수를 어떻게 보존합니까?. 당신은 사용해야합니다source.동일한 셸에서 스크립트를 실행하기 위해 내장되어 있습니다( name 아래에서도 사용 가능 ).

source ~/.workspace-shotcuts.sh

또 다른 문제는 ls.그러지 마세요. sh 및 bash와 같은 쉘에서는 $projects따옴표 바깥쪽에 쓰면 파일 이름을 구분하는 개행 문자에서 값이 분할되기 때문에 문제를 해결할 수 있습니다 . 그러나 실제로는 작동하지 않습니다. 예를 들어 파일 이름에 공백이 포함되어 있으면 공백으로 구분된 부분으로 분할됩니다. 쉘 스크립트에서는 출력을 구문 분석하지 말고 ls와일드카드를 사용하십시오. 이것은 zsh에서는 매우 간단합니다.

projects=(~/Workspace/*/)
for f in $projects; do …

다음에 해야 할 일은 꽤 복잡합니다. 이는 필요하지 않습니다 eval. 이를 사용하면 참조 오류가 발생합니다. zsh를 사용하고 있으므로 다음을 사용할 수 있습니다.기록 수정자 t문자열 조작 구조를 사용하지 않고 경로의 마지막 구성 요소를 추출합니다 $f:t. 파일 이름에 특수 문자가 포함되어 있으면 이를 보호해야 하며, zsh에서는 이를 쉽게 수행할 수 있습니다.매개변수 확장 플래그 q: ${(q)f}별칭 정의에 사용할 수 있는 인용된 파일 이름을 제공합니다.

projects=(~/Workspace/*/)
for f in $projects
do
  alias $f:t="cd ${(q)f}"
done

그러나 사실,넌 그냥 재창조하는 중이야cdpath추가하다auto_cd. 모두 긁어서 사용하세요

setopt auto_cd
cdpath+=~/Workspace

auto_cd옵션을 사용하면 변경하려는 디렉터리 이름을 cd ‍앞에 입력하지 않고도 입력할 수 있습니다. 이는 호출된 하위 디렉터리가 현재 디렉터리에 없는 경우 시도될 cdpath디렉터리 접두사의 배열입니다 .cd foofoo


bash 사용자가 이 스레드를 본 경우: 별칭이 지정된 메서드는 다음과 같습니다.

projects=(~/Workspace/*/)
for f in "${projects[@]}"; do
  f=${f%/}
  alias ${f##*/}="cd '${f//\'/\'\\\'\'}'"
done

방법 CDPATH

CDPATH=$CDPATH:$HOME/Workspace
shopt -s autocd

관련 정보