programing

Bash 스크립트의 스크립트파일명은 어떻게 알 수 있나요?

css3 2023. 4. 10. 22:06

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.shfoo.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,$2CLI 인수에 액세스 합니다.유사하게$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