명령에 대문자 변수 할당

명령에 대문자 변수 할당

현재 회사의 이전 직원이 작성한 일부 스크립트를 해독하려고 시도하는 동안 많은 스크립트에서 다음과 같은 특정 명령에 변수를 할당하는 다음 명령문을 발견했습니다.

CAT=cat
GREP=grep
SED=sed

나중에 스크립트에서 일반 명령 대신 다음 변수를 사용하고 있음을 알 수 있습니다.

$GREP -v "^#" `dirname $0`/abcdfilename | while read line
do
<some loop operations>
done

직접 사용 하는 대신 이 변수를 사용하는 grep것이 의미가 없습니다. 내 질문은 다음과 같습니다

  • 이런 식으로 grep 또는 sed(우리의 경우)를 실행하는 데 어떤 의미가 있습니까?
  • 이것은 다른 사람이 이해하기 어렵게 만들기 위해 스크립트를 작성하려는 누군가의 결과입니까?
  • 아니면 이것은 단지 잘못된 스크립팅의 예입니까?

답변1

표준 명령은 시스템에서 다르게 구현됩니다. Solaris 10 및 이전 버전과 마찬가지로 /bin/sh이전 Bourne 쉘과 /usr/xpg4/bin/shPOSIX 호환 쉘이 있습니다 . 또는 OSX에서는 호출 시 BSD sed를 사용 sed하고 gsed. 스크립트에서 사용할 구현을 선택할 수 있습니다.

따라서 변수를 사용하면 스크립트에서 구현을 변경하는 것이 더 쉽습니다. GNU sed가 필요한 경우:

SED=gsed

변수를 사용하지 않는 경우 sed스크립트에서 모든 항목을 바꿔야 합니다. 이 작업은 쉽게 수행할 수 있지만 이는 잘못된 프로그래밍 습관으로 간주됩니다.

답변2

스크립트 전체에서 재사용하는 거의 모든 것을 변수로 만들어야 한다는 주장이 있습니다. 왜냐하면 한 번 재정의하면 스크립트의 나머지 부분에 영향을 미칠 수 있기 때문입니다.

간단한 sed 검색/대체를 사용하여 기본적으로 동일한 작업을 수행할 수 있다고 주장할 수 있지만 많은 사용자는 교체할 의도가 없는 항목을 실수로 교체하는 것이 그리 어렵지 않기 때문에 검색/대체를 경계합니다.

실제로 기존 버전에 대해 다음과 같은 개선 사항을 권장합니다.

GREP=${GREP:-/bin/grep}

이는 GREP가 사용자가 셸에서 설정한 대로 설정되거나 설정되지 않은 경우 /bin/grep으로 설정됨을 의미합니다.

이 방법으로 사용자는 "grep"을 즉시 무시할 수 있습니다.

$ export GREP=/bin/fgrep
$ ./path/to/script.sh

답변3

이는 조기 최적화의 예일 수 있습니다.

기계에는 몇 가지 옵션이 있습니까?어느기계는 다음을 위해 사용됩니다.sed,grep, 그리고? 나는 컨센서스 평균이 1.0에 더 가깝다고 확신합니다. 특정 머신에서 두 가지 선택 사항이 주어지면 구현 차이로 인해 PATH에 있는 버전에서 스크립트가 실패하고 다른 버전에서 작동할 가능성은 얼마나 됩니까? 이런 일이 발생하면 솔루션이 스크립트나 경로를 변경할 가능성이 더 높습니까? 스크립트를 변경하는 것이 답으로 판명된다면 적어도 한 번의 호출을 찾을 가능성은 얼마나 됩니까?grep바꾸다$GREP? 덱의 스태킹에는 간접 참조가 필요하지 않으며, 그렇게 해도 예상대로 작동하지 않습니다.

나는 문화와 싸우지 않을 것입니다. 매장에 선호사항이 있는 경우$GREP또는/usr/bin/grep그렇지 않으면grep, 나는 함께 가서 잘 지낼 수 있습니다. 그렇지 않으면 KISS: 필요할 때까지 간접 사용을 피하세요.

관련 정보