
터미널에서 이상한 동작이 발생합니다.
다음 명령은 터미널에 아무것도 인쇄하지 않습니다.
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=auto
unalias grep
--color=never
이에 대해 취할 수 있는 또 다른 접근 방식도 있습니다. 스크립트 내에서 작동한다는 것을 알고 있으므로 유일한 설명은 이것이 환경적이라는 것입니다.
따라서 깨끗한 환경에서 시작하여 bash --noprofile --norc
프로필이 깨질 때까지 하나씩 가져오기 시작할 수 있습니다.
하지만 이 기술에는 함정이 있습니다. 를 사용하더라도 --noprofile --norc
CLI와 스크립트 간에는 기록 확장, 작업 제어 등 몇 가지 차이점이 있습니다. 하지만 다음 기능도 끌 수 있습니다: set +H
및 set -m
.