함수 내부에서 쉘 스크립트의 이름을 가져옵니다.

함수 내부에서 쉘 스크립트의 이름을 가져옵니다.

내가 이것을 가지고 있다고 가정 해 봅시다 :

#!/bin/sh
function show_help {
  cat<<%
Usage: $0 [-h]
%
}
# the following lines is pseudo-code
if argument contains "-h"
  show_help
otherwise
  do_stuff

실행하면 ./test예상대로 일부 작업이 수행되지만 실행하면 ./test -h생성됩니다.

Usage: show_help [-h]

하지만 난 그걸 실현할 거야

Usage: ./test [-h]

그렇다면 함수를 수정하여 show_help이를 어떻게 달성할 수 있을까요? 스크립트 자체를 수정하고 싶지 않기 때문에 SCRIPT_NAME=$0shebang 줄 아래에만 추가하지는 않겠습니다. 솔루션이 a 또는 function 과
같은 일종의 내장 변수이기를 바라고 있습니다 . 실제로 존재합니까?$PWDpwd

답변1

나는 이것을 재현할 수 없습니다. 이 질문에는 "/bash" 태그가 지정되어 있습니다.

Bash의 경우 $0은 항상 스크립트 이름이므로 /tmp/test에 있으면

#!/bin/bash
function show_help {
cat <<%
Usage: $0 [-h]
%
}
show_help

그럼 bash /tmp/test나한테 주세요 Usage: /tmp/test [-h].

get을 사용하면 POSIX가 아닌 방식으로 함수를 선언할 때 ksh가 $0을 설정하기 때문에 ksh93 /tmp/testget을 사용합니다 .Usage: show_help [-h]

이식 가능한 함수 선언으로 전환

#!/bin/bash
show_help() {
cat <<%
Usage: $0 [-h]
%
}
show_help

Usage: /tmp/test [-h]ksh와 bash에서 얻을 수 있습니다 .

그래서 원본 스크립트에는 오류가 많이 있었습니다. #!/bin/shbash에 관한 질문이라면 함수 선언이 올바르지 않고 #!/bin/bash마지막 구문이 잘못되었습니다 .if

답변2

BASH에서는 $FUNCNAME[1]을 사용합니다. $FUNCNAME[0]은 show_help입니다. show_help를 호출한 상위 함수의 줄 번호와 소스 파일 이름($BASH_LINENO[1], $BASH_SOURCE[1])을 얻을 수도 있습니다.

korn shell (ksh)에 대해 비슷한 답변을 찾고 있습니다.

답변3

왜냐하면 이 질문은 숙제 질문처럼 보이거든요. 그래서 정확한 답변보다는 몇 가지 힌트를 드리겠습니다.

  1. 실행 중인 프로세스의 상위 PID 가져오기grep PPid /proc/self/status | awk '{print $2}
  2. 실행 파일 이름을 알아보세요ls /proc/<PPid>/exe
  3. readlink를 사용하여 위의 소프트 링크 이름을 인쇄하세요.readlink /proc/<PPid>/exe

산출실행할 스크립트의 이름입니다.

관련 정보