내가 원하는 컬러 출력 grep
.
.... 하지만
- 전략 1: GREP_OPTIONS. 그러나 이것은 더 이상 사용되지 않습니다. 바라보다http://www.gnu.org/software/grep/manual/html_node/Environment-Variables.html
- 전략 2: 언뜻 보기에 GREP_COLORS는 솔루션처럼 보이지만 기능은 다릅니다.
- 전략 3: 별칭.
find ... | xargs grep
xargs가 별칭을 평가하지 않기 때문에 작동하지 않습니다 . - 전략 4: 간단한 래퍼 스크립트를 작성합니다. 아니요, 제 생각에는 너무 지저분하고 문제를 해결하는 것보다 더 많은 문제를 일으킬 것 같습니다.
- 전략 5: 소스 코드 패치
- 전략 6: grep 개발자에게 연락하여 GREP_OPTIONS 변경을 요청하세요.
- NICE-and-EASY 정책: ...이 콘텐츠가 누락되었습니다. 나는 전혀 단서가 없습니다.
이 문제를 어떻게 해결하나요?
답변1
OP가 언급한 이유 중 일부는 실제로 근거가 없습니다(예: 쉘 스크립트 작동 방식에 대한 이해 부족 및 간단한 래퍼 스크립트가 성능에 영향을 미치지 않는 방법에 대한 이해 부족).
이 답변에서는 전략 4가 실제로 여러 가지 이유(구현 용이성, 낮은 오버헤드, 모든 사용 사례에 대한 유연성 등)로 인해 좋은 솔루션임을 보여줍니다.
(Typical) 또는 (OpenSUSE, 기타) grep
에 설치된 대부분의 배포판 에서 기본값 은 또는 ./bin
/usr/bin
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
이미 있는지 여부와 사용 가능한 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
및가 포함됩니다. 래퍼 스크립트에 의존하기 때문에 전체 배포판이 "더럽다"고 생각하지 않는 한, 그러한 래퍼 스크립트가 "더럽다"고 생각할 이유가 없습니다.ldd
xfig
PATH에 래퍼 스크립트를 넣을 때 발생할 수 있는 문제
스크립트가 아닌 인간 사용자만 기본적으로 색상을 지원하는 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 또는 using 을 time /usr/local/bin/grep --version
사용하여 실행이 이전 버전의 래퍼 스크립트만큼 빠릅니다. 즉, 일반적으로 일반 실행 시간보다 1밀리초 더 깁니다 .GREP_OPTIONS
GREP_OPTIONS=--color=auto
grep
마지막 버전은 제가 개인적으로 추천하는 버전입니다.
요약하면 OP의 전략 4는 다음과 같습니다.
개발자 가
grep
추천함구현이 간단합니다 (두 줄)
오버헤드는 미미합니다(각 호출마다 이 특정 노트북의 대기 시간이 1밀리초씩 추가됩니다. 모든 시스템에서 쉽게 확인할 수 있습니다).
지원을 추가하는 래퍼 스크립트로 구현 가능
GREP_OPTS
(더 이상 사용되지 않음/지원되지 않음 대체GREP_OPTIONS
)스크립트나 기존 사용자에게 전혀 영향을 주지 않고 (
colorgrep
/ 와 같이) 구현 가능cgrep
이미 리눅스 배포판에서 널리 사용되고 있는 기술이기 때문에 '더러운' 기술이 아닌 일반적인 기술이다.
별도의 래퍼( / )로 구현하면 동작에 전혀 영향을 주지 않으므로 colorgrep
새로운 문제가 발생하지 않습니다 . 지원을 추가하는 래퍼 스크립트로 구현된 경우 이를 사용하면 기본 업스트림을 추가하는 것과 정확히 동일한 위험이 있습니다(기존 스크립트의 문제) . 따라서 "해결하는 것보다 더 많은 문제를 생성한다"는 설명은 완전히 잘못된 것입니다. 추가 문제는 생성되지 않습니다.cgrep
grep
GREP_OPTS
GREP_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). 명령 에 정말로 관심이 있다면 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
설정한 후 활성화하는 것은 매우 간단합니다.