mawk에서 자체 스크립트 이름을 인쇄하는 방법은 무엇입니까? bash $0에는 스크립트

bash $0에는 스크립트 이름이 포함되어 있지만 다음 내용으로 myscript.awk라는 스크립트를 만들면 awk에 있습니다.

#!/usr/bin/awk -f
BEGIN{ print ARGV[0] }

실행하면 “awk”만 인쇄됩니다. 또한 i> 0 인 ARGV [i]는 명령 행의 스크립트 인수에만 사용됩니다. 그렇다면 스크립트 이름 (이 경우 “myscript.awk”)을 인쇄하는 방법은 무엇입니까?



답변

cygwin의 bash에서 GNU awk 4.1.3으로 :

$ cat tst.sh
#!/bin/awk -f
BEGIN { print "Executing:", ENVIRON["_"] }

$ ./tst.sh
Executing: ./tst.sh

나는 그것이 얼마나 휴대용인지 모르겠다. 그러나 항상 그렇듯이 쉘 스크립트에서 shebang을 사용하여 awk 스크립트를 실행하지는 않습니다. 간단하게 유지하고 대신이 작업을 수행하십시오.

$ cat tst2.sh
awk -v cmd="$0" '
BEGIN { print "Executing:", cmd }
' "$@"

$ ./tst2.sh
Executing: ./tst2.sh

마지막으로 모든 플랫폼의 모든 쉘에서 현대적인 기능을 사용할 수 있습니다.


답변

나는 이것이 gawk 문서에 따라 가능하다고 생각하지 않습니다 .

마지막으로 ARGV[0](7.5 내장 변수 참조) 값은 운영 체제에 따라 다릅니다. 일부 시스템 awk에는 awk의 전체 경로 이름 (예 :)을 넣고 일부 시스템 에는 /bin/awk스크립트 이름 ( ‘advice’)을 넣습니다. ARGV[0]스크립트 이름을 제공 하는 가치에 의존하지 마십시오 .

linux당신은 더러운 해킹의 종류를 사용하여 시도 별 댓글에서 지적 할 수 스테판 Chazelas가 구현 경우이 가능합니다 awk지원은 NUL이 바이트 :

#!/usr/bin/awk -f

BEGIN { getline t < "/proc/self/cmdline"; split(t, a, "\0"); print a[3]; }

답변

awk 내에서 명령 이름을 얻는 직접적인 방법을 모르겠습니다. 그러나 하위 쉘을 통해 찾을 수 있습니다.

둔한 사람

GNU awk 및 ps명령을 사용하면 프로세스 ID를 사용 PROCINFO["PID"]하여 명령 이름을 임시 해결책으로 검색 할 수 있습니다 . 예를 들면 다음과 같습니다.

cmdname.awk

#!/usr/bin/gawk -f

BEGIN {
  ("ps -p " PROCINFO["pid"] " -o comm=") | getline CMDNAME
  print CMDNAME
}

mawk and nawk

동일한 접근 방식을 사용할 수 있지만 특수 쉘 변수 (부모 awk의 PID)에서 PID를 파생시킵니다 $PPID.

cmdname.awk

#!/usr/bin/mawk -f

BEGIN {
  ("ps -p $PPID -o comm=") | getline CMDNAME
  print CMDNAME
}

테스팅

다음과 같이 스크립트를 실행하십시오.

./cmdname.awk

두 경우 모두 출력 :

cmdname.awk

답변

POSIX로 awk:

#!/usr/bin/awk -f

BEGIN {
    print ENVIRON["AWKSCRIPT"]
}

그때:

AWKSCRIPT=test.awk ./test.awk
test.awk

답변

GNU awk 사용

점검 GNU의 AWK 사용 설명서를 – 7.5.2 내장 정보 전하는 그건 변수 내가 우연히 :

프로세스 번호

이 배열의 요소는 실행중인 awk 프로그램에 대한 정보에 대한 액세스를 제공합니다. 다음 요소 (알파벳순)는 사용 가능합니다.

PROCINFO [ “pid”]

현재 프로세스의 프로세스 ID

즉, 런타임 중에 프로그램의 PID를 알 수 있습니다. 그런 다음 system()주어진 PID로 프로세스를 찾는 데 사용 합니다.

#!/usr/bin/gawk -f
BEGIN{ pid=PROCINFO["pid"]
       system("ps -ef | awk '$2==" pid " {print $NF}'")
}

ps -ef두 번째 열에 PID를 표시하는을 사용 합니다. 실행이 완료 awk -f <script>되고 다른 매개 변수가 없다고 가정하면 행의 마지막 필드에 원하는 정보가 있다고 가정 할 수 있습니다.

매개 변수가있는 경우 줄을 다르게 구문 분석하거나 더 나은 방법으로 ps관심있는 열만 인쇄 하는 옵션을 사용해야 합니다.

테스트

$ awk -f a.awk
a.awk
$ cp a.awk hello.awk
$ awk -f hello.awk
hello.awk

GNU awk 사용자 안내서의 다른 장에서는 ARGV가 갈 길이 아니라고 말합니다 :

1.1.4 실행 가능한 awk 프로그램

마지막으로 ARGV [0]의 값 (내장 변수 참조)은 운영 체제에 따라 다릅니다. 일부 시스템에는 ‘awk’가 있고 일부 시스템에는 awk의 전체 경로 이름 (예 : / bin / awk)이 있고 일부 시스템에서는 스크립트 이름 ( ‘advice’)이 있습니다. (dc) 스크립트 이름을 제공하기 위해 ARGV [0]의 값에 의존하지 마십시오.