컬러 그렙 출력 : 별칭이 아닌 GREP_OPTIONS가 아님 GREP_COLORS는 첫눈에 솔루션처럼 보이지만 다른

의 컬러 출력을 원합니다 grep.

…. 그러나

  • 전략 1 : GREP_OPTIONS. 그러나 이것은 더 이상 사용되지 않습니다. http://www.gnu.org/software/grep/manual/html_node/Environment-Variables.html을 참조 하십시오
  • Stragegy 2 : GREP_COLORS는 첫눈에 솔루션처럼 보이지만 다른 점이 있습니다.
  • 전략 3 : 별칭. find ... | xargs grepxargs는 별칭을 평가하지 않기 때문에이 기능은 작동 하지 않습니다.
  • 전략 4 : 간단한 래퍼 스크립트를 작성하십시오. 아니요, 이것이 너무 더럽고 해결하는 것보다 더 많은 문제를 일으킨다 고 생각합니다.
  • 전략 5 : 소스 코드 패치
  • 전략 6 : grep 개발자에게 문의하여 GREP_OPTIONS의 교체를 요청하십시오.
  • 전략 NICE-and-EASY : … 이것은 빠졌습니다. 나는 단서가 없다.

이것을 해결하는 방법?

도와 주셔서 감사합니다!

…하지만 현상금을 줄 수 없습니다

무례하고, 거만하고, 모욕적이고, 욕설을 불러주세요 ….

해결책이 없습니다. 해결책이 없습니다. 대답이 그 질문을 만족시키지 못했습니다.

당신의 노력에 감사드립니다.



답변

OP가 옵션이 부적절하다고 말한 이유 중 일부는 실제로 근거가 없습니다. 다음은 OP 전략 4를 사용한 효과의 종류를 보여줍니다.


대부분의 배포 grep에서 /bin(일반) 또는 /usr/bin(OpenSUSE, 기타)에 설치되며 기본값 PATH은 또는 /usr/local/bin앞에 포함 됩니다. 이것은 당신 이/bin/usr/bin/usr/local/bin/grep

#!/bin/sh
exec /bin/grep --color=auto "$@"

여기서 /bin/sh배포판에서 제공하는 POSIX 호환 쉘 (대개 bash 또는 dash)이 있습니다. 경우 grep/usr/bin, 다음 있는지 확인

#!/bin/sh
exec /usr/bin/grep --color=auto "$@"

이 스크립트의 오버 헤드는 최소입니다. exec스크립트 인터프리터가 교체되는 문 수단 grep진; 이는 grep실행 중에 쉘이 메모리에 남아 있지 않음을 의미합니다 . 따라서, 유일한 오버 헤드는 스크립트 인터프리터의 하나의 추가 실행, 즉 벽시계 시간에서의 작은 대기 시간이다. 대기 시간은 거의 일정하며 ( 페이지 캐시 에 있는지 여부 grepsh이미 사용 가능한 I / O 대역폭 에 따라 달라짐 ) grep실행 시간 또는 처리하는 데이터 양 에 따라 달라지지 않습니다 .

그렇다면 래퍼 스크립트가 추가 한 오버 헤드, 즉 대기 시간이 얼마나 걸립니까?

찾으려면 위의 스크립트를 작성하고 실행하십시오.

time /bin/grep --version
time /usr/local/bin/grep --version

내 컴퓨터에서 전자는 실시간으로 0.005 초가 걸리고 (수 많은 실행에서) 후자는 0.006 초 실시간으로 걸립니다. 따라서 내 컴퓨터에서 랩퍼를 사용하는 오버 헤드는 호출 당 0.001 (또는 그 이하)입니다.

이것은 중요하지 않습니다.

많은 일반적인 응용 프로그램과 유틸리티가 동일한 접근 방식을 사용하기 때문에 이것에 대해 “더러운”것도 보지 못합니다. 당신의 컴퓨터에 등의 목록을 보려면 /bin하고 /usr/bin바로 실행

file /bin/* /usr/bin/* | sed -ne 's/:.*shell script.*$//p'

내 컴퓨터에서 위의 출력을 포함 egrep, fgrep, zgrep, which, 7z, chromium-browser, ldd, 그리고 xfig, 나는 꽤 자주 사용하는. 랩퍼 스크립트에 의존하여 전체 분배 “더러운”을 고려하지 않는 한, 랩퍼 스크립트를 “더러운”것으로 간주 할 이유가 없습니다.


이러한 래퍼 스크립트는 다음과 같은 문제를 일으킬 수 있습니다.

출력이 터미널 인 경우 사용자 지원 (스크립트와 반대) 만 기본적으로 색상 지원을 지원하는 grep 버전을 사용하는 경우 랩퍼 스크립트의 이름을 지정 colorgrep하거나 cgrepOP에 적합한 항목을 지정할 수 있습니다 .

동작 grep이 전혀 변경되지 않기 때문에 가능한 모든 호환성 문제를 피할 수 있습니다 .


grep랩퍼 스크립트를 사용하여 옵션을 사용 하지만 새로운 문제점을 피하는 방법 :

지원 되지 않는 GREP_OPTS경우에도 GREP_OPTIONS(이미 사용되지 않으므로) 사용자 정의를 지원하도록 랩퍼 스크립트를 쉽게 다시 작성할 수 있습니다 . 이 방법으로 사용자는 단순히 export "GREP_OPTIONS=--color=auto"자신의 프로필을 추가 하거나 유사 하게 만들 수 있습니다 . /usr/local/bin/grep그렇다면

#!/bin/sh
exec /bin/grep $GREP_OPTIONS "$@"

주위 $GREP_OPTIONS에 따옴표가 없으므로 사용자가 둘 이상의 옵션을 지정할 수 있습니다.

내 시스템에서 empty 또는 with로 실행 time /usr/local/bin/grep --version하는 것은 이전 버전의 래퍼 스크립트만큼 빠릅니다. 즉, 일반보다 실행하는 데 일반적으로 1 밀리 초가 걸립니다 .GREP_OPTIONSGREP_OPTIONS=--color=autogrep

이 마지막 버전은 개인적으로 사용하기를 권장하는 버전입니다.


요약하면, OP의 전략 4 :

  • grep개발자 가 권장하는 영역 입니다.

  • 구현하기가 쉽지 않습니다 (2 줄).

  • 오버 헤드가 미미 함 (이 특정 랩톱에서 호출 당 1 밀리 초 추가 대기 시간; 각 시스템에서 쉽게 확인)

  • GREP_OPTS지원 을 추가하는 래퍼 스크립트로 구현 가능 (더 이상 사용되지 않거나 지원되지 않음 GREP_OPTIONS)

  • 스크립트 또는 기존 사용자에게 전혀 영향을 미치지 않는 ( colorgrep/로 cgrep) 구현 가능

이미 Linux 배포판에서 널리 사용되는 기술이므로 “더러운”것이 아니라 일반적인 기술입니다.

별도의 래퍼 ( colorgrep/ cgrep) 로 구현하면 grep동작에 전혀 영향을 미치지 않으므로 새로운 문제를 만들 수 없습니다 . GREP_OPTS지원 을 추가하는 래퍼 스크립트로 구현 된 경우를 사용 GREP_OPTS=--color=auto하면 기본값 추가시 업스트림을 추가 --color=auto할 때와 동일한 위험 (기존 스크립트의 문제) 이 발생합니다. 따라서 이것이 “해결하는 것보다 더 많은 문제를 일으킨다”는 의견은 완전히 잘못된 것입니다. 추가적인 문제는 없습니다.


답변

첫 번째 전략과 함께 제공되는 설명서는 다음과 같습니다.

대신 별명이나 스크립트를 사용하십시오. 예를 들어, grep이 ‘/ usr / bin’디렉토리에 있으면 $ HOME / bin을 PATH 앞에 추가하고 다음을 포함하는 $ HOME / bin / grep 실행 스크립트를 작성할 수 있습니다.

#! /bin/sh
export PATH=/usr/bin
exec grep --color=auto --devices=skip "$@"

따라서 별명이 불가능한 경우 랩퍼 스크립트가 유일한 방법입니다.


답변

GREP_OPTIONS변수가 더 이상 사용되지 않는 이유는 grep스크립트의 어딘가에서 호출 될 때 문제를 일으키는 경향이 있고 스크립트가 변수에서 제공되는 대체 옵션과 작동하지 않기 때문입니다. 래퍼 스크립트를 작성 하면 다른 이름을 지정하지 않으면grep 동일한 문제가 발생 합니다.

$ cat ~/bin/cgrep
#!/bin/sh
exec grep --color=always "$@"
$ find  -exec cgrep  {} +

또는 선호하는 옵션을 변수에 저장하십시오. zsh 이외의 쉘에서는 옵션에 와일드 카드 문자 ( \[*?)가 포함되어 있으면 번거롭지 만, 따옴표없는 변수를 사용하여 인수가있는 명령을 얻을 수 있습니다.

cgrep=(grep --color=always)
find  -exec $cgrep  {} +

GNU와 BSD grep은 디렉토리 트리를 재귀 적으로 처리 할 수 ​​있으므로, 대부분의 경우 find와 함께 필요를 완화시킵니다 grep.


답변

가장 쉬운 방법은 별칭 (전략 3)을 사용하는 것입니다. 실제로 xargs명령에 신경 쓰면 bash 함수로 명령을 무시할 수 있습니다.

alias grep='grep --color'
xargs() {
    local args
    for ((i=1; i<=$#; i++))
    do
            if [[ "-E -L -P -I -s -d" == *"${!i}"* ]]; then
                    ((i=i+1))
            elif [[ ${!i:0:1} != "-" ]]; then
                    if [[ ${!i} == "grep" ]]; then
                            args="--color"
                    fi
                    /usr/bin/xargs ${@:1:i} $args ${@:i+1}
                    return;
            fi
    done
}

그러나 이것은 grep팀 이 권장하는 솔루션 인 것처럼 보이는 래퍼 명령을 사용하는 것보다 낫지 않습니다 .

/usr/local/bin/grep:

#!/bin/bash
/bin/grep --color "$@"

겸손한 견해로는 grep개발자 팀에 문의하여 GREP_OPTIONS변수에 대한 간단한 대체를 제공하여 grep환경 변수 에 따라 색상을 활성화 하도록 요청해야 합니다.

기본적으로 color옵션을 설정하거나 설정 한 경우 매우 간단합니다 GREP_COLORS.


답변

이것은 @NominalAnimal의 최고 답변에서 해결책이지만 일반적인 grep: ...경고 () 대신에 /bin/grep: ...있습니다.

#!/bin/bash
exec -a grep /bin/grep --color=auto "$@"