다양한 코딩 프로젝트 간에 전환하기 위한 몇 가지 바로 가기 명령을 선언하고 싶었기 때문에 다음 스크립트를 생각해냈습니다.
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 foo
foo
bash 사용자가 이 스레드를 본 경우: 별칭이 지정된 메서드는 다음과 같습니다.
projects=(~/Workspace/*/)
for f in "${projects[@]}"; do
f=${f%/}
alias ${f##*/}="cd '${f//\'/\'\\\'\'}'"
done
방법 CDPATH
은
CDPATH=$CDPATH:$HOME/Workspace
shopt -s autocd