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, 버전 4.4.0(1)-릴리스(x86_64-pc-linux-gnu)에서 GNU bash를 사용하고 있고 grep(GNU grep) 2.26을 사용하고 있습니다. 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일치가 방지됩니다.

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


이 문제를 해결하는 또 다른 방법이 있습니다. 스크립트 내에서 작동한다는 것을 알고 있으므로 유일한 설명은 앰비언트라는 것입니다.

따라서 깨끗한 환경에서 시작하여 bash --noprofile --norc프로필이 손상될 때까지 조금씩 프로필을 가져오기 시작합니다.

하지만 이 기술에는 문제가 있습니다. 그럼에도 불구하고 --noprofile --norcCLI와 스크립트에는 히스토리 확장, 작업 제어 등 일부 차이점이 있습니다. 끌 수도 있습니다: set +Hset -m.

관련 정보