컬러 grep 출력: GREP_OPTIONS가 아님 별칭이 아님

컬러 grep 출력: GREP_OPTIONS가 아님 별칭이 아님

내가 원하는 컬러 출력 grep.

.... 하지만

  • 전략 1: GREP_OPTIONS. 그러나 이것은 더 이상 사용되지 않습니다. 바라보다http://www.gnu.org/software/grep/manual/html_node/Environment-Variables.html
  • 전략 2: 언뜻 보기에 GREP_COLORS는 솔루션처럼 보이지만 기능은 다릅니다.
  • 전략 3: 별칭. find ... | xargs grepxargs가 별칭을 평가하지 않기 때문에 작동하지 않습니다 .
  • 전략 4: 간단한 래퍼 스크립트를 작성합니다. 아니요, 제 생각에는 너무 지저분하고 문제를 해결하는 것보다 더 많은 문제를 일으킬 것 같습니다.
  • 전략 5: 소스 코드 패치
  • 전략 6: grep 개발자에게 연락하여 GREP_OPTIONS 변경을 요청하세요.
  • NICE-and-EASY 정책: ...이 콘텐츠가 누락되었습니다. 나는 전혀 단서가 없습니다.

이 문제를 어떻게 해결하나요?

답변1

OP가 언급한 이유 중 일부는 실제로 근거가 없습니다(예: 쉘 스크립트 작동 방식에 대한 이해 부족 및 간단한 래퍼 스크립트가 성능에 영향을 미치지 않는 방법에 대한 이해 부족).

이 답변에서는 전략 4가 실제로 여러 가지 이유(구현 용이성, 낮은 오버헤드, 모든 사용 사례에 대한 유연성 등)로 인해 좋은 솔루션임을 보여줍니다.

(Typical) 또는 (OpenSUSE, 기타) grep에 설치된 대부분의 배포판 에서 기본값 은 또는 ./bin/usr/binPATH/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메모리에 유지되지 않음을 의미합니다. 따라서 유일한 오버헤드는 스크립트 인터프리터를 한 번 더 실행하는 것, 즉 벽시계 시간이 약간 지연되는 것입니다. 지연 시간은 거의 일정하며(페이지 캐시에 grep이미 있는지 여부와 사용 가능한 I/O 대역폭의 양에 따라 달라짐 ) 실행하는 데 걸리는 시간이나 처리되는 데이터의 양 sh에 따라 달라지지 않습니다 .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및가 포함됩니다. 래퍼 스크립트에 의존하기 때문에 전체 배포판이 "더럽다"고 생각하지 않는 한, 그러한 래퍼 스크립트가 "더럽다"고 생각할 이유가 없습니다.lddxfig

PATH에 래퍼 스크립트를 넣을 때 발생할 수 있는 문제

스크립트가 아닌 인간 사용자만 기본적으로 색상을 지원하는 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 또는 using 을 time /usr/local/bin/grep --version사용하여 실행이 이전 버전의 래퍼 스크립트만큼 빠릅니다. 즉, 일반적으로 일반 실행 시간보다 1밀리초 더 깁니다 .GREP_OPTIONSGREP_OPTIONS=--color=autogrep

마지막 버전은 제가 개인적으로 추천하는 버전입니다.

요약하면 OP의 전략 4는 다음과 같습니다.

  • 개발자 가 grep추천함

  • 구현이 간단합니다 (두 줄)

  • 오버헤드는 미미합니다(각 호출마다 이 특정 노트북의 대기 시간이 1밀리초씩 추가됩니다. 모든 시스템에서 쉽게 확인할 수 있습니다).

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

  • 스크립트나 기존 사용자에게 전혀 영향을 주지 않고 ( colorgrep/ 와 같이) 구현 가능cgrep

이미 리눅스 배포판에서 널리 사용되고 있는 기술이기 때문에 '더러운' 기술이 아닌 일반적인 기술이다.

별도의 래퍼( / )로 구현하면 동작에 전혀 영향을 주지 않으므로 colorgrep새로운 문제가 발생하지 않습니다 . 지원을 추가하는 래퍼 스크립트로 구현된 경우 이를 사용하면 기본 업스트림을 추가하는 것과 정확히 동일한 위험이 있습니다(기존 스크립트의 문제) . 따라서 "해결하는 것보다 더 많은 문제를 생성한다"는 설명은 완전히 잘못된 것입니다. 추가 문제는 생성되지 않습니다.cgrepgrepGREP_OPTSGREP_OPTS=--color=auto--color=auto

답변2

제공한 첫 번째 정책에 대한 문서는 다음을 보여줍니다.

대신 별칭이나 스크립트를 사용하세요. 예를 들어, grep이 "/usr/bin" 디렉터리에 있는 경우 $HOME/bin을 PATH에 추가하고 다음 내용을 포함하는 실행 가능한 스크립트 $HOME/bin/grep을 생성할 수 있습니다.

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

따라서 앨리어싱이 불가능하다면 래퍼 스크립트가 유일한 방법입니다.

답변3

이 변수가 더 이상 사용되지 않는 이유 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

답변4

가장 쉬운 방법은 별칭을 사용하는 것입니다(전략 3). 명령 에 정말로 관심이 있다면 xargsbash 기능을 사용하여 명령을 재정의할 수 있습니다.

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설정한 후 활성화하는 것은 매우 간단합니다.

관련 정보