grep은 if 문에서 항상 0 종료 상태로 종료됩니다.

grep은 if 문에서 항상 0 종료 상태로 종료됩니다.

Korn의 cd 명령을 에뮬레이트하는 bash 스크립트를 작성하고 싶습니다. cd old new 이를 PWD로 바꾼 다음 새 디렉토리에 들어가려고 합니다.oldnewcd

스크립트는 다음과 같습니다.

#!/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 조건에서는 grepif가 참인지 확인해야 합니다 old. PWD그렇지 않은 경우 PWD"잘못된 대체" 오류 메시지가 인쇄되어야 합니다. 내 문제는 exit status항상 . 따라서 if 조건은 절대 실행되지 않습니다.grep0

예를 들어:

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}"
}

관련 정보