[linux] Bash 스크립트에서 스크립트 파일 이름을 어떻게 알 수 있습니까?

스크립트 자체 내의 Bash 스크립트 파일 이름을 어떻게 확인할 수 있습니까?

내 스크립트가 파일 runme.sh에있는 것처럼 하드 코딩없이 “Your running runme.sh”메시지를 표시하려면 어떻게해야합니까?



답변

me=`basename "$0"`

일반적으로 원하는 것이 아닌 symlink 1을 읽으 려면 (일반적으로 사용자를 혼동하지 않으려는 경우) 다음을 시도하십시오.

me="$(basename "$(test -L "$0" && readlink "$0" || echo "$0")")"

IMO는 혼란스러운 결과를 낳습니다. “foo.sh를 실행했지만 bar.sh를 실행 중입니다!? 버그 여야합니다!” 또한 다른 이름의 심볼릭 링크를 사용하는 목적 중 하나는 이름에 따라 다른 기능을 제공하는 것입니다 (일부 플랫폼에서는 gzip 및 gunzip을 생각하십시오).


1 에,이다 해결 심볼릭 링크 등 사용자가 실행 때 foo.sh실제로 심볼릭 링크에 bar.sh, 당신은 확인 된 이름을 사용하고자하는 bar.sh것이 아니라 foo.sh.


답변

# ------------- SCRIPT ------------- #


#!/bin/bash

echo
echo "# arguments called with ---->  ${@}     "
echo "# \$1 ---------------------->  $1       "
echo "# \$2 ---------------------->  $2       "
echo "# path to me --------------->  ${0}     "
echo "# parent path -------------->  ${0%/*}  "
echo "# my name ------------------>  ${0##*/} "
echo
exit

# ------------- 호출 ------------- ## ------------- 호출 ------------- #

# 다음 줄에서 첫 번째 인수는 double 내에서 호출됩니다. # 다음 줄에서 첫 번째 인수는 double 내에서 호출됩니다. 
두 단어를 포함하므로 # 및 작은 따옴표두 단어를 포함하므로 # 및 작은 따옴표

$ /misc/shell_scripts/check_root/show_parms.sh " 'hello there'" " 'william'"/ misc / shell_scripts / check_root / show_parms . sh " '안녕하세요'" " 'william'" 

# ------------- 결과 ------------- ## ------------- 결과 ------------- #

---> 'hello there' 'william'와 함께 호출 된 인수---> 'hello there' 'william'와 함께 호출 된 인수
# $ 1 ----------------------> '안녕하세요'# $ 1 ----------------------> '안녕하세요'
# $ 2 ----------------------> 'william'# $ 2 ----------------------> 'william'
# 나에게 경로 --------------> /misc/shell_scripts/check_root/show_parms.sh# 나에게 경로 --------------> /misc/shell_scripts/check_root/show_parms.sh
# 부모 경로 -------------> / misc / shell_scripts / check_root# 부모 경로 -------------> / misc / shell_scripts / check_root
# 내 이름 -----------------> show_parms.sh# 내 이름 -----------------> show_parms.sh

# ------------- 끝 ------------- ## ------------- 끝 ------------- #


답변

bash는> = 3 개 다음 작품 :

$ ./s
0 is: ./s
BASH_SOURCE is: ./s
$ . ./s
0 is: bash
BASH_SOURCE is: ./s

$ cat s
#!/bin/bash

printf '$0 is: %s\n$BASH_SOURCE is: %s\n' "$0" "$BASH_SOURCE"


답변

$BASH_SOURCE 스크립트를 소싱 할 때 정답을 제공합니다.

그러나 여기에는 경로가 포함되므로 스크립트 파일 이름 만 얻으려면 다음을 사용하십시오.

$(basename $BASH_SOURCE) 


답변

스크립트 이름에 공백이 있으면 MacOS 를 사용 "$0"하거나 "$(basename "$0")"MacOS 에서보다 강력한 방법을 사용 하십시오 "$(basename \"$0\")". 이렇게하면 이름이 엉망이되거나 해석되지 않습니다. 일반적으로 쉘에서 변수 이름을 항상 큰 따옴표로 묶는 것이 좋습니다.


답변

경로없이 원한다면 사용하십시오. ${0##*/}


답변

Chris Conway에 대답하려면 Linux에서 적어도 다음을 수행하십시오.

echo $(basename $(readlink -nf $0))

readlink는 기호 링크의 값을 인쇄합니다. 심볼릭 링크가 아닌 경우 파일 이름을 인쇄합니다. -n은 개행을 인쇄하지 않도록 지시합니다. -f는 링크를 완전히 따르도록 지시합니다 (심볼릭 링크가 다른 링크에 대한 링크 인 경우 해당 링크도 해결합니다).