Bash 스크립트의 스크립트파일명은 어떻게 알 수 있나요?
스크립트 자체의 Bash 스크립트파일 이름을 확인하려면 어떻게 해야 하나요?
를 내 runme.sh
"You are running the runme.sh" 은 "You are running runme.sh" 을 참조하십시오.
me=`basename "$0"`
일반적으로 사용자가 원하는 것이 아닌 심볼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
.
# ------------------------------------------------------------- #
#!/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
# ----------------------------------------------------------- #
# 다음 줄에서 첫 번째 인수는 두 배 이내로 호출됩니다.#와 작은 따옴표는 두 개의 단어가 포함되어 있기 때문에
$ / misc / shell _ snot / check _ root / show _ parms . sh " " hello there " " " " " " " "
# -------------------------------------------------------------
# 인수 호출 시 ---> "hello there" "hello" "there" "#1 ---------------------------------------------------------------------# 2달러 ------------------------------------------------------------------# 나에게의 패스 ------------------------------------------------------------------------------------------------------쉿# 부모 패스 ----------------------------------------------------------------------------# my name ---------------------------------> show_parms.쉿
# ----------------------------------------------------------- #
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)
은 '스페이스'를 사용하는 입니다."$0"
★★★★★★★★★★★★★★★★★」"$(basename "$0")"
- - mac MacOS:"$(basename \"$0\")"
이렇게 하면 이름이 엉키거나 해석되는 것을 방지할 수 있습니다.일반적으로 셸에서는 변수 이름을 항상 이중 따옴표로 묶는 것이 좋습니다.
가 없는 는, 「」를 합니다.${0##*/}
Linux(적어도)에서는 Chris Conway에 응답하려면 다음 절차를 수행합니다.
echo $(basename $(readlink -nf $0))
readlink는 심볼릭링크 값을 출력합니다.심볼릭 링크가 아닌 경우 파일 이름을 인쇄합니다. -n은 새 줄을 인쇄하지 않도록 지시합니다. -f는 링크를 완전히 따르도록 지시합니다(심볼릭 링크가 다른 링크에 대한 링크일 경우 해당 링크도 해결됩니다).
이 행은 파일이 원본인지 스크립트로 실행되는지 여부에 관계없이 항상 작동합니다.
echo "${BASH_SOURCE[${#BASH_SOURCE[@]} - 1]}"
, 「」를 합니다.readlink
재귀적이든 비재귀적이든 상관없습니다.
는 '원라이너'를 할 수 .BASH_SOURCE
와 그 FUNCNAME
.
BASH_소스
FUNCNAME 배열 변수 내의 대응하는 셸 함수명이 정의되는 소스 파일명이 멤버인 배열 변수.셸 함수 ${FUNCNAME[$i]}은(는) ${BASH_SOURCE[$i]} 파일에 정의되어 있으며 ${BASH_SOURCE[$i+1]}에서 호출됩니다.
기능명
실행 콜 스택에 현재 있는 모든 셸 함수의 이름을 포함하는 배열 변수입니다.인덱스 0의 요소는 현재 실행 중인 셸 함수의 이름입니다.맨 아래 요소(인덱스가 가장 높은 요소)는 "main"입니다.이 변수는 셸 함수가 실행 중일 때만 존재합니다.FUNCNAME 에의 할당은 무효가 되어 에러 상태가 반환됩니다.FUNCNAME 이 설정되어 있지 않은 경우는, 그 후에 리셋 되어도, 그 특수한 속성이 없어집니다.
이 변수는 BASH_LINENO 및 BASH_SOURCE와 함께 사용할 수 있습니다.FUNCNAME의 각 요소에는 콜 스택을 설명하기 위한 대응하는 요소가 있습니다.예를 들어 ${FUNCNAME[$i]}이(가) ${BASH_SOURCE[$i+1] 파일 ${BASH_LINENO[$i]}에서 호출되었습니다.발신자 빌트인은 이 정보를 사용하여 현재 콜스택을 표시합니다.
[출처:Bash 매뉴얼]
일부 코멘트에서는 확장자를 사용하지 않는 파일명에 대해 질문하고 있기 때문에, 그 예를 다음에 나타냅니다.
FileName=${0##*/}
FileNameWithoutExtension=${FileName%.*}
맛있게 드세요!
이러한 답변은 제시된 케이스에 대해 올바르지만, 'source' 키워드를 사용하여 다른 스크립트에서 스크립트를 실행(같은 셸에서 실행되도록 함)해도 여전히 문제가 있습니다.이 경우 호출 스크립트의 $0을 얻을 수 있습니다.그리고 이 경우 스크립트의 이름 자체를 알 수 없다고 생각합니다.
이것은 엣지 케이스이므로 너무 심각하게 받아들이지 마십시오.다른 스크립트에서 직접 스크립트를 실행하는 경우('소스' 없이) $0을 사용하는 것이 좋습니다.
질문: Tanktalus의 (승인된) 답변은 다음과 같습니다.
me=$(readlink --canonicalize --no-newline $0)
스크립트가 다른 bash 스크립트에서 소스된 경우 다음을 사용할 수 있습니다.
me=$(readlink --canonicalize --no-newline $BASH_SOURCE)
사용자에게 피드백을 제공하는 것이 목적이라면 심볼링크를 참조 해제하는 것이 혼란스럽다는 것에 동의합니다만, 스크립트나 다른 파일에 정식 이름을 가져올 필요가 있는 경우가 있습니다.이것이 가장 좋은 방법입니다.
this="$(dirname "$(realpath "$BASH_SOURCE")")"
이것에 의해, 심볼릭 링크(실제 패스로 해결), 스페이스(큰따옴표로 처리)가 해결됩니다.또, 소스(./myscript) 또는 다른 스크립트($BASH_SOURCE 처리)가 호출한 경우에도, 현재의 스크립트명이 검색됩니다.그런 다음 재사용하거나 다른 곳에서 쉽게 복사할 수 있도록 환경 변수에 저장하는 것이 좋습니다(this=).
$0을 사용하여 스크립트 이름(풀패스)을 결정할 수 있습니다.스크립트 이름만 가져오려면 다음 명령을 사용하여 변수를 트리밍할 수 있습니다.
basename $0
셸 스크립트를 호출할 경우
/home/mike/runme.sh
$0은 풀네임
/home/mike/runme.sh
basename $0은 기본 파일 이름을 가져옵니다.
runme.sh
이 기본 이름을 변수에 넣어야 합니다.
filename=$(basename $0)
추가 텍스트 추가
echo "You are running $filename"
그래서 대본이
/home/mike/runme.sh
#!/bin/bash
filename=$(basename $0)
echo "You are running $filename"
이것은 와 함께 잘 동작합니다../self.sh
,~/self.sh
,source self.sh
,source ~/self.sh
:
#!/usr/bin/env bash
self=$(readlink -f "${BASH_SOURCE[0]}")
basename=$(basename "$self")
echo "$self"
echo "$basename"
크레딧:여러 개의 답을 조합해서 이 답을 얻었어요.
echo "$(basename "`test -L ${BASH_SOURCE[0]} \
&& readlink ${BASH_SOURCE[0]} \
|| echo ${BASH_SOURCE[0]}`")"
인bash
스크립트 파일명을 취득할 수 있습니다.$0
.일반적으로.$1
,$2
CLI 인수에 액세스 합니다.유사하게$0
스크립트(스크립트 파일명)를 트리거하는 이름에 액세스 하는 것입니다.
#!/bin/bash
echo "You are running $0"
...
...
다음과 같은 경로로 스크립트를 호출하는 경우/path/to/script.sh
그리고나서$0
또, 파일명에 패스를 지정합니다.이 경우,$(basename $0)
스크립트 파일 이름만 가져옵니다.
짧고 명료하며 심플한,my_script.sh
#!/bin/bash
running_file_name=$(basename "$0")
echo "You are running '$running_file_name' file."
출력:
./my_script.sh
You are running 'my_script.sh' file.
빌 헤르난데스 씨 덕분입니다제가 채택하고 있는 몇 가지 기본 설정을 추가했습니다.
#!/bin/bash
function Usage(){
echo " Usage: show_parameters [ arg1 ][ arg2 ]"
}
[[ ${#2} -eq 0 ]] && Usage || {
echo
echo "# arguments called with ----> ${@} "
echo "# \$1 -----------------------> $1 "
echo "# \$2 -----------------------> $2 "
echo "# path to me ---------------> ${0} " | sed "s/$USER/\$USER/g"
echo "# parent path --------------> ${0%/*} " | sed "s/$USER/\$USER/g"
echo "# my name ------------------> ${0##*/} "
echo
}
건배.
DIRECTORY=$(cd `dirname $0` && pwd)
위의 내용은 Stack Overflow 질문에서 얻은 것입니다.Bash 스크립트는 어떤 디렉토리에 저장되어 있는지 알 수 있습니까?이 항목에서도 도움이 될 것 같습니다.
디미트레 라둘로프의 대답에서 영감을 얻어 생각해낸 것이다(참고로, 내가 투표한 것).
script="$BASH_SOURCE"
[ -z "$BASH_SOURCE" ] && script="$0"
echo "Called $script with $# argument(s)"
대본에 관계없이
. path/to/script.sh
또는
./path/to/script.sh
$0은 실행 중인 스크립트의 이름을 제공합니다.스크립트 파일을 만들고 다음 코드를 추가합니다.
#!/bin/bash
echo "Name of the file is $0"
그리고 터미널에서 이렇게 실행한다.
./file_name.sh
모든 경우에 스크립트 또는 소스 스크립트의 "실제 경로"를 얻으려면 다음 절차를 따릅니다.
fullname=$(readlink $0) # Take care of symbolic links
dirname=${fullname%/*} # Get (most of the time) the dirname
realpath=$(dirname $BASH_SOURCE) # TO handle sourced scripts
[ "$realpath" = '.' ] && realpath=${dirname:-.}
다음은 bash 스크립트를 생성하는 bash 스크립트입니다(새로 작성된 "workdir" 서브dir 및 현재 dir의 "mytest"에서). bash 스크립트는 다른 스크립트를 송신합니다.이 스크립트는 turm에서 bash 정의 함수를 호출합니다.이 함수를 기동하기 위해 다양한 방법으로 테스트됩니다.
#!/bin/bash
##############################################################
ret=0
fullname=$(readlink $0) # Take care of symbolic links
dirname=${fullname%/*} # Get (most of the time) the dirname
realpath=$(dirname $BASH_SOURCE) # TO handle sourced scripts
[ "$realpath" = '.' ] && realpath=${dirname:-.}
fullname_withoutextension=${fullname%.*}
mkdir -p workdir
cat <<'EOD' > workdir/_script_.sh
#!/bin/bash
##############################################################
ret=0
fullname=$(readlink $0) # Take care of symbolic links
dirname=${fullname%/*} # Get (most of the time) the dirname
realpath=$(dirname $BASH_SOURCE) # TO handle sourced scripts
[ "$realpath" = '.' ] && realpath=${dirname:-.}
fullname_withoutextension=${fullname%.*}
echo
echo "# ------------- RESULTS ------------- #"
echo "# path to me (\$0)-----------> ${0} "
echo "# arguments called with ----> ${@} "
echo "# \$1 -----------------------> $1 "
echo "# \$2 -----------------------> $2 "
echo "# path to me (\$fullname)----> ${fullname} "
echo "# parent path(\${0%/*})------> ${0%/*} "
echo "# parent path(\$dirname)-----> ${dirname} "
echo "# my name ----\${0##*/}------> ${0##*/} "
echo "# my source -\${BASH_SOURCE}-> ${BASH_SOURCE} "
echo "# parent path(from BASH_SOURCE) -> $(dirname $BASH_SOURCE)"
echo "# my function name -\${FUNCNAME[0]}------> ${FUNCNAME[0]}"
echo "# my source or script real path (realpath)------------------> $realpath"
echo
[ "$realpath" = "workdir" ] || ret=1
[ $ret = 0 ] || echo "*******************************************************"
[ $ret = 0 ] || echo "*********** ERROR **********************************"
[ $ret = 0 ] || echo "*******************************************************"
show_params () {
echo
echo "# --- RESULTS FROM show_params() ---- #"
echo "# path to me (\$0)-----------> ${0} "
echo "# arguments called with ----> ${@} "
echo "# \$1 -----------------------> $1 "
echo "# \$2 -----------------------> $2 "
echo "# path to me (\$fullname)----> ${fullname} "
echo "# parent path(\${0%/*})------> ${0%/*} "
echo "# parent path(\$dirname)-----> ${dirname} "
echo "# my name ----\${0##*/}------> ${0##*/} "
echo "# my source -\${BASH_SOURCE}-> ${BASH_SOURCE} "
echo "# parent path(from BASH_SOURCE) -> $(dirname $BASH_SOURCE)"
echo "# my function name -\${FUNCNAME[0]}------> ${FUNCNAME[0]}"
echo "# my source or script real path (realpath)------------------> $realpath"
echo
[ "$realpath" = "workdir" ] || ret=1
[ $ret = 0 ] || echo "*******************************************************"
[ $ret = 0 ] || echo "*********** ERROR **********************************"
[ $ret = 0 ] || echo "*******************************************************"
}
show_params "$@"
EOD
cat workdir/_script_.sh > workdir/_side_by_side_script_sourced.inc
cat <<'EOD' >> workdir/_script_.sh
echo "# . $realpath/_side_by_side_script_sourced.inc 'hello there' 'william'"
. $realpath/_side_by_side_script_sourced.inc 'hello there' 'william'
[ $ret = 0 ] || echo "*******************************************************"
[ $ret = 0 ] || echo "*********** ERROR **********************************"
[ $ret = 0 ] || echo "*******************************************************"
EOD
chmod +x workdir/_script_.sh
[ -L _mytest_ ] && rm _mytest_
ln -s workdir/_script_.sh _mytest_
# ------------- CALLED ------------- #
called_by () {
echo '=========================================================================='
echo " Called by : " "$@"
echo '=========================================================================='
eval "$@"
}
called_by bash _mytest_
called_by ./_mytest_
called_by bash workdir/_script_.sh
called_by workdir/_script_.sh
called_by . workdir/_script_.sh
# ------------- RESULTS ------------- #
echo
echo
[ $ret = 0 ] || echo "*******************************************************"
[ $ret = 0 ] || echo "*********** ERROR **********************************"
[ $ret = 0 ] || echo "*******************************************************"
echo
[ $ret = 0 ] && echo ".... location of scripts (\$realpath) should always be equal to $realpath, for all test cases at date".
echo
# ------------- END ------------- #
echo "You are running $0"
이런 거?
export LC_ALL=en_US.UTF-8
#!/bin/bash
#!/bin/sh
#----------------------------------------------------------------------
start_trash(){
ver="htrash.sh v0.0.4"
$TRASH_DIR # url to trash $MY_USER
$TRASH_SIZE # Show Trash Folder Size
echo "Would you like to empty Trash [y/n]?"
read ans
if [ $ans = y -o $ans = Y -o $ans = yes -o $ans = Yes -o $ans = YES ]
then
echo "'yes'"
cd $TRASH_DIR && $EMPTY_TRASH
fi
if [ $ans = n -o $ans = N -o $ans = no -o $ans = No -o $ans = NO ]
then
echo "'no'"
fi
return $TRUE
}
#-----------------------------------------------------------------------
start_help(){
echo "HELP COMMANDS-----------------------------"
echo "htest www open a homepage "
echo "htest trash empty trash "
return $TRUE
} #end Help
#-----------------------------------------------#
homepage=""
return $TRUE
} #end cpdebtemp
# -Case start
# if no command line arg given
# set val to Unknown
if [ -z $1 ]
then
val="*** Unknown ***"
elif [ -n $1 ]
then
# otherwise make first arg as val
val=$1
fi
# use case statement to make decision for rental
case $val in
"trash") start_trash ;;
"help") start_help ;;
"www") firefox $homepage ;;
*) echo "Sorry, I can not get a $val for you!";;
esac
# Case stop
언급URL : https://stackoverflow.com/questions/192319/how-do-i-know-the-script-file-name-in-a-bash-script
'programing' 카테고리의 다른 글
문서의 일부에는 문서 검사기가 삭제할 수 없는 개인 정보가 포함될 수 있습니다. (0) | 2023.04.10 |
---|---|
R에서 Excel 날짜 형식을 적절한 날짜로 변환하는 방법 (0) | 2023.04.10 |
Windows에 /dev/null이 있습니까? (0) | 2023.04.10 |
InvokeAsync와 Begin의 차이점은 무엇입니까?WPF 디스패처 호출 (0) | 2023.04.10 |
텍스트를 잘라내는 대신 줄바꿈하는 셀을 사용하여 WPF 데이터 그리드를 얻는 방법은 무엇입니까? (0) | 2023.04.10 |