의 컬러 출력을 원합니다 grep
.
…. 그러나
- 전략 1 : GREP_OPTIONS. 그러나 이것은 더 이상 사용되지 않습니다. http://www.gnu.org/software/grep/manual/html_node/Environment-Variables.html을 참조 하십시오
- Stragegy 2 : GREP_COLORS는 첫눈에 솔루션처럼 보이지만 다른 점이 있습니다.
- 전략 3 : 별칭.
find ... | xargs grep
xargs는 별칭을 평가하지 않기 때문에이 기능은 작동 하지 않습니다. - 전략 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
실행 중에 쉘이 메모리에 남아 있지 않음을 의미합니다 . 따라서, 유일한 오버 헤드는 스크립트 인터프리터의 하나의 추가 실행, 즉 벽시계 시간에서의 작은 대기 시간이다. 대기 시간은 거의 일정하며 ( 페이지 캐시 에 있는지 여부 grep
와 sh
이미 사용 가능한 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
하거나 cgrep
OP에 적합한 항목을 지정할 수 있습니다 .
동작 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_OPTIONS
GREP_OPTIONS=--color=auto
grep
이 마지막 버전은 개인적으로 사용하기를 권장하는 버전입니다.
요약하면, 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 "$@"