이 "bash" 스크립트에서 "awk"를 확인해야 하는 이유는 무엇입니까?

이 "bash" 스크립트에서 "awk"를 확인해야 하는 이유는 무엇입니까?

"rbenv" Ruby 버전 관리자의 오픈 소스 코드를 읽고 있었는데 이 라이브러리에 대한 명령 중 하나를 보았습니다.설치 gawk되어 있는지 확인해보세요awk:

  awk="$(type -p gawk awk 2>/dev/null | head -n1)"
  if [ -z "$awk" ]; then
    echo "rbenv: cannot find awk" >&2
    return 1
  fi

하지만 bash파일 맨 위에도 shebang이 표시됩니다.

#!/usr/bin/env bash

awk처음에 나는 shebang이 우리가 스크립트 내에서 실행되고 있음을 보장한다면 우리가 그것을 실행할 수 있다고 가정할 수 있어야 한다고 생각했습니다 . 그러나 나중에 이것이 쉘 명령이 아니라 UNIX 명령이라는 bash것을 발견했습니다 . awkUNIX 시스템이 아닌(예: Windows) 문서에서 이 스크립트를 실행합니다. ~에서이 링크gawk, 나는 이것이 UNIX가 아닌 시스템에서 가장 일반적인 스타일 이라고 추론합니다 .awk

awk우리가 설치되었다고 가정할 수 없는 이유는 그것이 UNIX 명령이고 UNIX 시스템에서 실행되지 않을 수 있기 때문이라는 것이 맞습니까 ? 또한 설치 gawk되지 않은 시스템(예: UNIX 시스템이 아닌 시스템)에서 찾을 수 있을 것으로 예상되는 awk가장 가능성 있는 대체 항목이기 때문에 확인하고 있습니까 ?

답변1

awk예를 들어 나중에 코드에서 해당 변수를 사용할 수도 있다고 생각합니다 . "$awk" 'script' file그렇지 않으면 그냥 작성해야 합니다 if ! type -p gawk awk >/dev/null 2>&1; then ...error.... 해당 변수를 사용하는 경우 PATH에서 첫 번째인 gawk 또는 다른 awk를 사용하고, 변수가 없으면 작성할 수 있습니다. awk 'script' filePATH에서 이전 gawk를 놓칠 수도 있습니다.

아 대략 맞는 것 같다. 조금만 더 보면그들의 코드:

  awk="$(type -p gawk awk 2>/dev/null | head -n1)"
  if [ -z "$awk" ]; then
    echo "rbenv: cannot find awk" >&2
    return 1
  fi

  # shellcheck disable=SC2016
  "$awk" '
    /^Summary:/ {
      summary = substr($0, 10)
      next
    }

따라서 그들이 정말로 원하는 것은 PATH에서 awk 또는 gawk의 첫 번째 버전을 찾아서 사용하는 것입니다. 둘 다 존재하지 않으면 실패하는 것은 IMHO에 대한 방어적인 사후 고려입니다.

답변2

bash와 awk(또는 gawk) 사이에는 고정된 관계가 없습니다. 단, 둘 다 실행 가능한 프로그램이고 일부 PATH경로에 존재할 수 있으며 둘 다 오픈 소스이고 무료이며 GNU에서 개발되었습니다.

GNU 실행 파일은 UNIX 시스템에서 완전히 유효하고 사용할 수 있습니다. Solaris 시스템에서는 보통 bash(운영 체제에서 제공하는 기본 목록에서 여러 번), 괜찮아요. 그리고 bash는 대부분의 POSIX 요구 사항을 준수합니다. 예: MacOS는 POSIX 인증을 획득하기 위해 bash를 사용합니다.

Linux는 UNIX 철학을 고수하려고 노력하는 운영 체제입니다. GNU가 GNU is not Unix다음 과 같이 정의된 유일한 이유 는 Linux가비독점.

당신은 말한다:awk가 UNIX 명령임을 확인했습니다.: 예. 리눅스 명령어이기도 합니다. 그리고 리눅스에서 사용되는안드로이드에서, 그리고수백 가지 이상의 버전운영 체제. 모든 것이 *nix입니다. 반품:윈도우와 같은예, Windows에도 Unix 계층을 사용할 수 있습니다. 또한 GNU awk는 *nix 시스템에서 가장 일반적인 awk 버전입니다. 예, Windows는 *nix가 아닌 소수의 운영 체제 중 하나입니다.

설치되지 않을 수 있는 이유 awk는 일부 시스템 개발자가 nawk"최상의 대안"(비록 유사하더라도)으로 설치하기로 결정할 수 있기 때문입니다 awk. 이는 개발자가 작성한 콘텐츠를 손상시킬 수 있습니다.awkgawkrbenv

1 다음과 같은 붉은 청어에 빠지지 마십시오. Linux그냥 커널. 일반적으로 Linux라고 불리는 것은 Linus가 개발한 커널과 일반적으로 GNU의 오픈 소스 사용자 도구 세트를 갖춘 운영 체제입니다.

관련 정보