Bash에는 $0
스크립트 이름이 있지만 awk에서는 다음 내용으로 myscript.awk라는 스크립트를 생성합니다.
#!/usr/bin/awk -f
BEGIN{ print ARGV[0] }
실행하면 "awk"만 인쇄됩니다. 또한 i>0인 ARGV[i]는 명령줄의 스크립트 인수에만 사용됩니다. 그렇다면 스크립트 이름(이 경우 "myscript.awk")을 인쇄하려면 어떻게 해야 합니까?
답변1
Cygwin의 bash에서 GNU awk 4.1.3 사용:
$ cat tst.sh
#!/bin/awk -f
BEGIN { print "Executing:", ENVIRON["_"] }
$ ./tst.sh
Executing: ./tst.sh
휴대성이 얼마나 좋은지 전혀 몰랐습니다. 그러나 항상 그렇듯이 awk 스크립트를 실행하기 위해 쉘 스크립트에서 shebang을 사용하지는 않을 것입니다. 왜냐하면 이는 단지 가능한 기능을 빼앗아갈 뿐이기 때문입니다. 간단하게 다음과 같이 하세요.
$ cat tst2.sh
awk -v cmd="$0" '
BEGIN { print "Executing:", cmd }
' "$@"
$ ./tst2.sh
Executing: ./tst2.sh
마지막 것은 모든 플랫폼의 모든 쉘에서 최신 awk와 작동합니다.
답변2
awk에서 명령 이름을 얻는 직접적인 방법을 모르겠습니다. 그러나 서브셸을 통해 찾을 수 있습니다.
멍하니
GNU awk 및 ps
명령을 사용하면 프로세스 ID를 사용하여 PROCINFO["PID"]
해결 방법으로 명령 이름을 검색할 수 있습니다. 예를 들어:
cmdname.awk
#!/usr/bin/gawk -f
BEGIN {
("ps -p " PROCINFO["pid"] " -o comm=") | getline CMDNAME
print CMDNAME
}
모크 앤 녹
동일한 접근 방식을 사용할 수 있지만 awk
특수 쉘 변수(부모의 PID)에서 PID를 파생시킬 수 있습니다.$PPID
cmdname.awk
#!/usr/bin/mawk -f
BEGIN {
("ps -p $PPID -o comm=") | getline CMDNAME
print CMDNAME
}
시험
다음과 같이 스크립트를 실행하세요.
./cmdname.awk
두 경우 모두 출력:
cmdname.awk
답변3
불가능하다고 생각해요gawk
문서:
ARGV[0]
마지막으로 (섹션 7.5 내장 변수 참조)의 값은 운영 체제에 따라 다릅니다. 일부 시스템은 이를awk
거기에 넣고, 일부 시스템은 awk의 전체 경로 이름(예:/bin/awk
)을 넣고, 일부 시스템은 스크립트 이름("advice")을 넣습니다.ARGV[0]
스크립트 이름을 제공하기 위해 값에 의존하지 마십시오 .
댓글에서 지적했듯이 시도해 볼 수 있는 linux
더러운 해킹이 있습니다.스티븐 차제라스awk
구현이 NUL 바이트를 지원하는 경우 가능합니다.
#!/usr/bin/awk -f
BEGIN { getline t < "/proc/self/cmdline"; split(t, a, "\0"); print a[3]; }
답변4
GNU awk 사용
조사하다GNU awk 사용자 가이드 - 7.5.2 정보 전달을 위한 내장 변수나는 우연히 다음을 발견했다:
프로그램 정보#
이 배열의 요소는 실행 중인 awk 프로그램에 대한 정보에 대한 액세스를 제공합니다. 다음 요소(알파벳순으로 나열)의 사용이 보장됩니다.
PROCINFO["pid"]
현재 프로세스의 프로세스 ID입니다.
이는 런타임 시 프로그램의 PID를 알 수 있음을 의미합니다. 그런 다음 이 주어진 PID를 사용하여 system()
프로세스를 찾아야 합니다.
#!/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가 올바른 선택이 아니라고 말합니다.
마지막으로 ARGV[0]의 값(내장 변수 참조)은 운영 체제에 따라 다릅니다. 일부 시스템에서는 "awk"를 입력하고, 일부 시스템에서는 awk의 전체 경로 이름(예: /bin/awk)을 입력하며, 일부 시스템에서는 스크립트 이름("advice")을 입력합니다. (DC)스크립트 이름을 제공하기 위해 ARGV[0] 값에 의존하지 마십시오.