배포 스크립트: Shebang으로 /bin/gawk 또는 /usr/bin/gawk를 사용해야 합니까?

배포 스크립트: Shebang으로 /bin/gawk 또는 /usr/bin/gawk를 사용해야 합니까?

gawk는 보통 /bin이나 /usr/bin에 있나요? 동의 #!/usr/bin/env gawk하지만 매개변수를 사용할 수 없습니다. 지금은 를 사용하고 있습니다 #!/bin/gawk -f. 스크립트는 매우 길고 작은따옴표가 많이 포함되어 있으며 표준 입력에서 작동합니다.

GNU Awk 매뉴얼에는1.1.4 실행 가능한 awk 프로그램예제에서는 #!/bin/awk를 사용하지만 다음과 같이 말합니다.

많은 시스템에서는 in 대신에 awkin을 찾을 수 있습니다 . 경고 사항./usr/bin/bin

대부분의 사람들은 무엇을 합니까? 나는 읽었다sed는 /bin에서 표준화된 것으로 추정됩니다.그리고 Perl은 /usr/bin에서 표준화된 것으로 추정됩니다(sed 링크와 동일한 페이지이지만 이 게시물에 대한 세 번째 링크를 만들 수는 없습니다). awk/gawk은 어떻습니까? 어느 것이 더 일반적이고 인기가 있는지 아는 사람이 있습니까?

답변1

이것은 command에 인수를 전달할 필요가 없는 경우 #!/usr/bin/env gawk작동 하지만 많은 커널(Linux 포함)은 shebang 프로그램에 단일 인수만 허용합니다.

그렇지 않으면 다음을 수행할 수 있습니다.다국어이 프로그램은 쉘 래퍼이자 awk 스크립트입니다. 이것은 awk를 위한 것입니다.

#!/bin/sh
true + /; exec gawk -f "$0"; exit; / {}
# awk script starts here

쉘 분석:

  • true + /;— 두 개의 지연 인수 true(아무 작업도 수행하지 않음) +/.
  • 이것은 개행 gawk문자를 포함하지 않고 슬래시로 작성된 모든 쉘 조각일 수 있습니다 \/(쉘이 신경 쓰지 않는 내부 따옴표 제외).
    이 호출은 execgawk를 하위 프로세스로 실행하는 대신 쉘을 gawk로 대체합니다.
  • exit;— gawk를 찾을 수 없는 경우 쉘을 종료합니다. 쉘이 실행을 시작하기 전에 전체 줄을 구문 분석하려고 시도하는 경우 유효한 쉘 구문이 아닌 한 그 이후의 모든 내용은 무시됩니다.

이상한 분석:

  • 슬래시 사이의 비트는 정규식입니다.
  • true + /REGEX/- 조건. true은 정의되지 않은 변수이므로 값은 0이지만 상관없습니다.
  • {}— 위의 조건이 true인 경우 아무 작업도 수행되지 않습니다.

답변2

Gilles가 제안한 솔루션은 실제로 매우 좋은 접근 방식입니다(마지막으로 그의 게시물에서 투표라는 평판을 얻었습니다 :)).

어쨌든 명령에 대해 내가 이해한 바로 execexit쉘 프로세스가 awk.

또한 스크립트가 호출 매개변수에 액세스할 수 있도록 awk제안된 솔루션을 일부 변경하는 것이 좋습니다.

#!/bin/sh
true + /; exec -a "$0" gawk -f "$0" -- "$@"; / {}
# awk script starts here

-a "$0"스크립트가 호출 이름에 액세스할 수 있도록 허용합니다 . 그렇지 않으면 awk변수에 액세스할 때 항상 또는 를 얻습니다. 마찬가지로 스크립트가 배열의 나머지 매개변수에 액세스할 수 있도록 허용하는 것은 스크립트가 매개변수를 해석하지 않고도 매개변수를 수신할 수 있도록 하는 것입니다.gawkARGV[0]"$@"ARGV[1...N]---<something>

기억/고려해야 할 한 가지는 스크립트 블록 끝에 명령문을 추가하는 것입니다 exit(0);. 그렇지 않으면 위협을 스크립트의 모든 매개 변수에 대한 입력 파일로 전달합니다. (이것은 우리가 행에서 제거한 명령문과 전혀 관련이 없습니다. 이 명령문은 접근할 수 없는 쉘 명령문이었고 제안된 종료는 awk 코드에 있었습니다.)BEGIN { ... }awkawkexittrue + ...

답변3

Shebang은 처음부터 그다지 유연하지 않습니다.. 몇몇 상황이 있을 수 있어요작동하는 두 번째 매개변수가 있습니다., 저는 FreeBSD가 그 중 하나라고 생각합니다.

gawk 및 운영 체제와 함께 제공되는 대부분의 유틸리티는 /usr/bin/.

이전 UNIX에서는 /usr/로컬 디스크 공간과 워크스테이션당 비용을 절약하기 위해 NFS나 일부 저렴한 미디어를 통해 설치하는 것이 일반적이었습니다. /bin/시작하는 데 필요한 모든 것이 있어야 합니다.단일 사용자 모드. /usr/신뢰할 수 있는 미디어에 설치되지 않기 때문에 /bin/일반 관리 및 문제 해결에 충분히 사용자 친화적일 수 있도록 충분한 유틸리티가 포함되어 있습니다.

이것은 원래 Linux에서 상속되었지만 디스크 공간은 더 이상 문제가 되지 않으며 대부분의 경우 루트 파일 시스템에 있기 때문에 현재 추세는 (적어도 Linux 세계에서는) /usr/모든 것을 루트 파일 시스템으로 옮기는 것입니다 . /usr/bin따라서 배포판에서 설치한 대부분의 유틸리티를 여기에서 찾을 수 있습니다. 등과 같은 가장 기본적인 유틸리티도 있습니다 cp. (글쎄, 아직은 아닙니다).rmls

shebang의 선택에 관하여. 전통적으로 이는 관리자나 사용자가 환경에 따라 편집해야 하는 항목입니다. 개발자는 다른 사람의 시스템에서 인터프리터가 파일 시스템의 어느 곳에나 위치할 수 있다는 것을 알고 있습니다(예: /usr/local/bin, /opt/gawk-4.0.1/bin). 적절하게 패키지된 스크립트(rpm, deb 등)는 배포 패키지에 의존하거나(예: 인터프리터에 알려진 위치가 있음) 설치 중에 올바른 해시뱅을 설정하는 구성 스크립트가 있습니다.

답변4

최신 coreutils(IIUC 8.30+)가 설치되어 있으면 이제 다음을 사용할 수 있습니다.

#!/usr/bin/env -S gawk -f

모든 옵션은 env에 매개변수로 전달되어 분할됩니다.

관련 정보