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