내가 이것을 가지고 있다고 가정 해 봅시다 :
#!/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=$0
shebang 줄 아래에만 추가하지는 않겠습니다. 솔루션이 a 또는 function 과
같은 일종의 내장 변수이기를 바라고 있습니다 . 실제로 존재합니까?$PWD
pwd
답변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/test
get을 사용합니다 .Usage: show_help [-h]
이식 가능한 함수 선언으로 전환
#!/bin/bash
show_help() {
cat <<%
Usage: $0 [-h]
%
}
show_help
Usage: /tmp/test [-h]
ksh와 bash에서 얻을 수 있습니다 .
그래서 원본 스크립트에는 오류가 많이 있었습니다. #!/bin/sh
bash에 관한 질문이라면 함수 선언이 올바르지 않고 #!/bin/bash
마지막 구문이 잘못되었습니다 .if
답변2
BASH에서는 $FUNCNAME[1]을 사용합니다. $FUNCNAME[0]은 show_help입니다. show_help를 호출한 상위 함수의 줄 번호와 소스 파일 이름($BASH_LINENO[1], $BASH_SOURCE[1])을 얻을 수도 있습니다.
korn shell (ksh)에 대해 비슷한 답변을 찾고 있습니다.
답변3
왜냐하면 이 질문은 숙제 질문처럼 보이거든요. 그래서 정확한 답변보다는 몇 가지 힌트를 드리겠습니다.
- 실행 중인 프로세스의 상위 PID 가져오기
grep PPid /proc/self/status | awk '{print $2}
- 실행 파일 이름을 알아보세요
ls /proc/<PPid>/exe
- readlink를 사용하여 위의 소프트 링크 이름을 인쇄하세요.
readlink /proc/<PPid>/exe
산출삼실행할 스크립트의 이름입니다.