grep은 bash 스크립트에서는 작동하지만 터미널에서는 작동하지 않습니다.

grep은 bash 스크립트에서는 작동하지만 터미널에서는 작동하지 않습니다.

터미널에서 이상한 동작이 발생합니다.

다음 명령은 터미널에 아무것도 인쇄하지 않습니다.

comment=$(
    cat /usr/share/applications/brasero.desktop | 
    grep '^Comment=' |
    grep -Po '(?<=^Comment=)[ --0-9A-Za-z/.]*'
)
echo $comment

정확히 동일한 명령, 동일한 구문이 bash 스크립트 내에서 완벽하게 작동합니다.

보통 사람들이 반대 행동에 대해 불평하는 것을 봅니다.

위 작업은 수백 가지 방법으로 수행될 수 있다는 것을 알고 있지만 왜 위 명령이 내 터미널에서 작동하지 않는지 이해할 수 없습니다.

반면에 다음 명령은 터미널과 스크립트 모두에서 정상적으로 작동합니다.

comment=$(
    cat /usr/share/applications/brasero.desktop |
    grep -Po '(?<=^Comment=)[ --0-9A-Za-z/.]*'
)
echo $comment

grep -Po '(?<=Exec=)[ --0-9A-Za-z/:space:]*' > /usr/share/applications/brasero.desktop

나는 Debian 8 Sid에서 grep(GNU grep) 2.26과 함께 GNU bash 버전 4.4.0(1)-릴리스(x86_64-pc-linux-gnu)를 사용합니다. xfce와 mate 터미널 모두에서 시도했지만 동일한 동작을 수행했습니다.

감사해요

답변1

이와 같은 문제가 발생하면 제대로 작동하는 것을 얻을 때까지 테스트에서 항목을 제거하기 시작해야 합니다.

예를 들어, 시작점이 다음과 같은 경우:

comment=$(cat /usr/share/applications/brasero.desktop |grep '^Comment=' |grep -Po '(?<=^Comment=)[ --0-9A-Za-z/.]*');echo $comment

먼저 변수 항목을 제거하십시오.

cat /usr/share/applications/brasero.desktop |grep '^Comment=' |grep -Po '(?<=^Comment=)[ --0-9A-Za-z/.]*'

그런 다음 두 번째를 제거하십시오 grep.

cat /usr/share/applications/brasero.desktop |grep '^Comment='

그런 다음 다른 grep :

cat /usr/share/applications/brasero.desktop

결국 당신은 그것이 작동하기 시작하는 지점을 발견하게 될 것입니다. 특별한 경우에는 다음과 같이 작업이 시작됩니다.

cat /usr/share/applications/brasero.desktop |grep '^Comment='

grep그래서 문제가 되는 것은 바로 그 순간이다 . 다른 항목을 다시 추가하고 여전히 작동하는지 확인하세요.

comment=$(cat /usr/share/applications/brasero.desktop |grep '^Comment=');echo $comment

실제로 그렇습니다. 그렇다면 문제는 무엇입니까? 글쎄, 이 마지막 출력이 어떻게 컬러로 출력되었는지 주목하세요. 출력에는 ANSI 색상 이스케이프 코드가 있습니다. 이로 인해 두 번째 grep일치가 방지됩니다.

해결 방법은 별칭을 , 또는 do grep로 변경하거나 수동으로 명령에 추가하는 것입니다.--color=autounalias grep--color=never


이에 대해 취할 수 있는 또 다른 접근 방식도 있습니다. 스크립트 내에서 작동한다는 것을 알고 있으므로 유일한 설명은 이것이 환경적이라는 것입니다.

따라서 깨끗한 환경에서 시작하여 bash --noprofile --norc프로필이 깨질 때까지 하나씩 가져오기 시작할 수 있습니다.

하지만 이 기술에는 함정이 있습니다. 를 사용하더라도 --noprofile --norcCLI와 스크립트 간에는 기록 확장, 작업 제어 등 몇 가지 차이점이 있습니다. 하지만 다음 기능도 끌 수 있습니다: set +Hset -m.

관련 정보