프로그래밍 방식으로 이상한 맛을 감지하는 방법(예: gawk 대 nawk)

프로그래밍 방식으로 이상한 맛을 감지하는 방법(예: gawk 대 nawk)

내가 사용하는 명령줄 응용 프로그램은 기본적으로 bash 셸 스크립트 모음입니다. 이 애플리케이션은 BSD/OSX 및 Linux에서 실행되도록 작성되었습니다. 스크립트 중 하나는 awk에 따라 다릅니다. 여기에는 두 개의 awk 명령이 포함되어 있습니다. 하나는 nawk(표준 BSD awk 구현)용으로 작성되고 다른 하나는 gawk(GNU awk 구현)용으로 작성되었습니다.

논의된 두 awk 명령은 특히 다른 환경과 상호 호환되지 않습니다. nawk 명령은 gawk와 함께 실행될 때 실패합니다. 스크립트는 커널 이름(예: uname -s)을 확인하여 호스트 환경을 결정한 다음 적절한 awk 명령을 실행합니다. 그러나 저는 GNU 핵심 유틸리티가 설치된 Mac OS X에서 작업하는 것을 선호하므로 스크립트가 올바르게 실행되지 않습니다.

이 버그를 가장 잘 해결할 수 있는 방법을 생각하는 동안, 프로그래밍 방식으로 공통 명령줄 유틸리티의 다양한 버전을 상대적으로 강력하고 이식 가능한 방식으로 구별할 수 있으면 좋겠다는 생각이 들었습니다.

나는 nawk가 버전 정보를 인쇄하기 위해 "-V" 플래그를 허용하지 않는다는 것을 알고 다음과 같은 것이 작동해야 한다고 생각했습니다.

awk -V &>/dev/null && echo gawk || echo nawk

또 다른 변형은 다음과 같습니다.

awk -Wversion &>/dev/null && echo gawk || echo nawk

이는 내 테스트 환경(OS X 및 CentOS) 모두에서 작동하는 것 같습니다. 내 질문은 다음과 같습니다.

  • 이것이 최선의 방법입니까?
  • awk의 다른 변형(예: mawk, jaw 등)을 처리하기 위해 이를 확장할 수 있는 방법이 있습니까?
  • 다른 버전의 awk에 대해 걱정할 가치가 있습니까?

또한 나는 awk에 대해 거의 아는 바가 없다는 점을 언급하고 싶습니다.

답변1

if awk --version 2>&1 | grep -q "GNU Awk"
then
    awk 'BEGIN {print "I am GNU Awk"}'

elif awk -Wv 2>&1 | grep -q "mawk"
then
    awk 'BEGIN {print "I am mawk"}'

else
    awk 'BEGIN {print "I might be nawk, might not be"}'
fi

또는 test is awk는 심볼릭 링크입니다.

awk=$( command -v awk )
[[ -L $awk ]] && readlink $awk # make some decision about the result of that

답변2

명령 을 시도 which하고 종료 코드를 사용하십시오.

which nawk
if [[ $? == 0 ]]; then
    command="nawk"
else
    command="gawk"
fi

그런 다음 변수를 명령으로 사용하도록 스크립트 형식을 지정하십시오.

$command '{print $1}` 

다음과 같이 읽혀질 것이다

nawk '{print $1}`

만약 which발견되었다면. 그렇지 않으면 다음을 사용합니다.gawk

답변3

GNU Awk는 일반적으로 기본적으로 GNU를 사용하는 시스템에서 GNU에 대한 심볼릭 링크로 설치 gawk됩니다 awk. 나는 BSD와 OS X 시스템이 이미 자신만의 awk.

if gawk '{ exit; }' < /dev/null 2> /dev/null
then
    echo "gawk available"
else
    echo "gawk not available"
fi

답변4

autoconf의 AC_PROG_AWK m4 매크로를 남용하여 하나를 선택하고 적절하게 정렬할 수도 있습니다. 하지만 그건 좀 많을지도 몰라

관련 정보