$PATH의 바이너리를 변경하는 빌드 스크립트가 있습니다($PATH 자체는 편집하지 않지만 이미 $PATH에 있는 폴더에 파일을 추가/제거합니다). zsh의 자동 완성은 빌드에 대한 응답으로 추가/제거된 파일을 반영하도록 업데이트되지 않으므로 셸을 다시 시작하거나 내장된 "rehash" 셸을 실행하여 자동 완성 캐시를 업데이트하도록 지시해야 합니다.
나는 rehash를 자동으로 실행하기로 결정하여 먼저 다음을 수행했습니다.
build() {
~/bin/real_build && rehash
}
그러나 쉘 기능은 자체 하위 쉘에서 실행되므로 rehash는 내가 사용하는 터미널의 쉘이 아닌 하위 쉘의 캐시를 업데이트합니다. 그래서 나는 이것을 다음과 같이 바꿨습니다.
alias build='~/bin/real_build && rehash'
빌드에 매개변수를 전달하지 않는 한 작동합니다. "clean"을 전달하면 실행되기를 원합니다.
~/bin/real_build clean && rehash
하지만 이렇게 할 것입니다:
~/bin/real_build && rehash clean
그래서 막혔습니다. 별칭을 사용할 수 있지만 매개변수를 전달할 수 없거나, 함수를 사용할 수 있지만 실제로 자동 완성 항목을 업데이트할 수는 없습니다. 두 가지를 모두 작동시키는 방법이 있습니까?
답변1
일반적인 중괄호 대신 함수 본문 주위에 괄호를 사용하지 않는 한 쉘 함수는 자체 하위 쉘에서 실행되지 않습니다. 귀하의 함수는 내가 본 모든 zsh 버전에서 실행 가능한 해시를 업데이트하며 이 동작을 변경할 수 있는 옵션이 없다고 생각합니다.
답변2
source
아마도 이것이 최선의 선택이라고 생각합니다 . 예는 다음과 같습니다.
cat << EOF > foo
touch $1
chmod +x $1
rehash
EOF
foo
다음과 같이 실행하세요:
source foo bar
이것이 당신의 길에 있다면 bar
지금 할 수 있습니다.
답변3
쉘 함수는 쉘 스크립트와 같은 인수를 사용합니다. "$@"
, $*
$1... $n
.다른 모든 작업도 유효합니다.
이 경우 함수의 인수를 사용해 보십시오 $1
.
build() {
~/bin/real_build ${1} && rehash
}
""
real_build 스크립트가 이를 매개변수로 처리할 수 없으면 따옴표를 사용하지 마십시오.
""
다른 것과 다르지 않습니다.
이는 특정 위치에 매개변수가 필요한 "별칭"을 생성하는 좋은 방법입니다.