bash 명령줄이 아닌 bash 스크립트에서 실행할 때 동일한 sed 정규식(grep 이후)이 실패하는 이유는 무엇입니까?

bash 명령줄이 아닌 bash 스크립트에서 실행할 때 동일한 sed 정규식(grep 이후)이 실패하는 이유는 무엇입니까?

여기에 스크립트가 있습니다. 내가 실행하면 성공합니다.BASH 프롬프트, 그러나 스크립트에는 없습니다. 어떤 아이디어가 있나요?


"실패"라고 말하면 sed regex일치하는 항목이 없으므로 대체된 텍스트가 없다는 의미입니다. 명령줄에서 실행하면 일치합니다.

또한 이에 대한 답변이 있을 수도 있습니다. 이것은 내 grep별명과 이상한 상호 작용 과 관련 이 있습니다 GREP_OPTIONS. 나는 그 세부 사항으로 응답할 것입니다.

#!/bin/bash

for ((x = 101; x <= 110; x++)); do
    urls="${urls} www$x.site.com/config"
done;

curl -s ${urls} | grep -i "Git Commit" | sed -r "s/.*Git Commit<\/td><td>([^<]+).*/\1/g"

답변1

저는 실제로 이것을 알아낼 수 있었고, 같은 벽에 머리를 부딪히는 다음 Google 직원을 위해 여기에 추가해야겠다고 생각했습니다.

grep 별칭이 있습니다그리고 GREP_OPTIONS놓다. 이로 인해 다른 명령으로 파이프되는 경우에도 색상 강조 표시가 스크립트 내에서 유지됩니다. 이것은 일반적으로 함께 잘 작동하지 않습니다 sed.

내 .alias 및 옵션은 다음과 같습니다.

alias grep='grep -i --color'
export GREP_OPTIONS="--color=always"

따라서 스크립트에서 실행할 때 alias 명령을 사용하지 않으므로 색상이 항상 켜져 있어야 합니다. 따라서 별칭을 확인하면 해당 --color옵션이 표시됩니다( auto즉, "다른 명령으로 파이프되는 출력에 색상을 지정하지 않음"(예: sed)).

GREP_OPTIONSgrep저도 설정한 것을 잊어버렸기 때문에 혼란스럽습니다. 따라서 스크립트의 기본값이 기본값으로 color설정 될 것으로 예상합니다 auto(global 을 설정하지 않은 경우 그렇게 됩니다 GREP_OPTIONS). 그러나 그것은 진실이 아니다.

내 새로운 설정은 다음과 같습니다(태그가 중복된 것 같지만 --color기억할 GREP_OPTIONS수 있도록 그대로 두겠습니다).

alias grep='grep --color=always'
export GREP_OPTIONS="--ignore-case --color"

이렇게 하면 명령줄에 있을 때마다 모든 grep이 강조 표시됩니다(보통 내가 원하는 것입니다). 그러나 스크립트에서는 다른 명령으로 파이프되지 않은 경우에만 기본적으로 색상이 지정됩니다. 여전히 많은 스크립트에 --color=always를 추가해야 합니다(대부분의 경우 출력을 볼 수 없는 경우를 제외하고는 다른 명령으로 파이프할 때에도 강조 표시하는 경향이 있기 때문입니다).

관련 정보