grep이 내 집 컴퓨터와 사무실 컴퓨터에서 다르게 동작하는 이유는 무엇입니까? [닫기]

grep이 내 집 컴퓨터와 사무실 컴퓨터에서 다르게 동작하는 이유는 무엇입니까? [닫기]

아래 코드를 실행하면 내 컴퓨터에서는 감지되지만 내 사무실 컴퓨터에서 동일한 명령을 실행할 때는 감지되지 않습니다. 이 모호한 동작의 이유는 무엇일까요?

$p는 텍스트 파일의 한 줄이며 xyzxyz if ( abc ) 읽는 동안 grep에 줄을 전달하는 데 사용합니다.

grep -qw -e 'if(' -e 'if' <<< $p
if [ $? -ne 0 ]; then

do something

fi

답변1

이전 버전에는 bash해당 버그/잘못된 기능이 있었습니다.

 cat <<< $var

의 내용은 $var단어로 분할되지만(와일드카드로 구분되지 않음), 결과 단어는 공백으로 연결된 다음 명령에 대한 입력으로 설정된 임시 파일에 저장됩니다 cat.

<<<이는 이 zsh 연산자를 지원하는 다른 쉘과 일관성을 유지하기 위해 bash-4.4에서 수정되었습니다.

이전 버전의 경우 이는 변수를 참조해야 하는 또 다른 경우입니다.

따라서 다음 을 $IFS포함 하면 차이점을 설명할 수 있습니다 .if

$ a='if' bash4.1 -c 'IFS=f; cat <<< $a'
i
$ a='if' bash4.4 -c 'IFS=f; cat <<< $a'
if

어쨌든, -e 'if('텍스트에 if(단어가 포함되어 있으면 if단어도 포함되므로 중복된다는 점에 유의하세요.

또한 bash정규식 일치 기능이 내장되어 있으므로 언제든지 다음을 수행할 수 있습니다.

re='\<if\>'
if [[ $p =~ $re ]]; then
  printf '"%s" contains a "if" word\n' "$p"
fi

(적어도 Linux Mint 및 RHEL과 같은 시스템에서는 ERE에 가 있지만 \<지원 한다면 \>ERE 에는 및 가 있을 가능성이 높습니다 .grep-w\<\>

(위의 경우는 인용이 필요하지 않은 매우 드문 경우 중 하나입니다 $p(인용해도 문제가 되지는 않지만).$re 기필코 아니다인용됨(그렇지 않으면 내용이 정규 표현식이 아닌 고정 문자열로 처리됨)

표준 sh구문을 사용하여 다음을 수행할 수도 있습니다.

case +$p+ in
  (*[^[:alnum:]_]if[^[:alnum:]_]*)
    printf '"%s" contains a "if" word\n' "$p"
esac

같은 효과를 얻으려면.

관련 정보