Korn의 cd 명령을 에뮬레이트하는 bash 스크립트를 작성하고 싶습니다. cd old new
이를 PWD로 바꾼 다음 새 디렉토리에 들어가려고 합니다.old
new
cd
스크립트는 다음과 같습니다.
#!/usr/bin/env bash
function korn_cd
{
case "$#" in
0 | 1 ) builtin cd $1 ;;
2 ) if ! echo "$PWD" | grep "$old" ; then
echo "bash: cd: bad subsitiution";
return 1;
fi;
new_dir=${PWD//$1/$2};
builtin cd $new_dir; ;;
* ) echo "bash: cd: wrong arg count" 1>&2; return 1 ;;
esac ;
}
if 조건에서는 grep
if가 참인지 확인해야 합니다 old
. PWD
그렇지 않은 경우 PWD
"잘못된 대체" 오류 메시지가 인쇄되어야 합니다. 내 문제는 exit status
항상 . 따라서 if 조건은 절대 실행되지 않습니다.grep
0
예를 들어:
PWD="~/Documents/Code"
korn_cd aaaaa bbbbb
"교체 오류"라는 오류 메시지가 표시되지 않습니다.
어떻게 해결할 수 있나요?
답변1
문제는 old
적어도 게시한 코드 부분에서는 설정되지 않았다는 것입니다. grep
빈 문자열을 검색하면 항상 일치 ""
하고 0 종료 코드가 반환됩니다.
$ echo $PWD | grep ""; echo $?
/home/jim
0
답변2
다음에서 문자열 비교를 사용하는 것이 더 효율적입니다 bash
.
if [[ $PWD != *$old* ]]; then
특정 값이 있다고 가정합니다 $old
(함수에 설정되어 있지 않아 문제입니다).
귀하의 기능을 부분적으로 구현하면 다음과 같을 것 같습니다.
cd () {
if [[ $PWD != *$1* ]]; then
printf 'cd: string not in pwd: %s\n' "$1"
return 1
fi
builtin cd "${PWD/$1/$2}"
}
( zsh
내장된 동일한 기능에서 오류 메시지를 빌리는 것)cd
이 함수는 사용자가 다른 매개변수를 전달하는 것을 허용하지 않습니다 cd
. 옵션을 처리하려면 전체 명령줄 구문 분석을 수행해야 합니다.
옵션 무시:
cd () {
if [[ $# -lt 2 ]]; then
builtin cd "$@"
return
fi
if [[ $PWD != *$1* ]]; then
printf 'cd: string not in pwd: %s\n' "$1"
return 1
fi
builtin cd "${PWD/$1/$2}"
}