내 터미널에 이상한 동작이 있습니다.
다음 명령은 터미널에 아무것도 인쇄하지 않습니다.
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 --norc
CLI와 스크립트에는 히스토리 확장, 작업 제어 등 일부 차이점이 있습니다. 끌 수도 있습니다: set +H
및 set -m
.