IT

$ 0와 BASH_SOURCE 중에서 선택

lottoking 2020. 10. 8. 07:26
반응형

$ 0와 BASH_SOURCE 중에서 선택


하나를 선택할 어떻게 않습니다 "$0""${BASH_SOURCE[0]}"

GNU 의이 설명 은 저에게 매우 도움이되지 않습니다.

    BASH_SOURCE

 An array variable whose members are the source filenames where the
 corresponding shell function names in the FUNCNAME array variable are
 defined. The shell function ${FUNCNAME[$i]} is defined in the file
 ${BASH_SOURCE[$i]} and called from ${BASH_SOURCE[$i+1]}

참고 : POSIX 호환 솔루션의 경우이 답변을 참조하십시오 .

${BASH_SOURCE[0]}(또는 모든 간단히 $BASH_SOURCE[1] )에는 다음과 같은 호출 시나리오 에서 포함하는 펼쳐집니다 . 특히 펼쳐가 소싱 된 경우 에도 .$0

또한 Charles Duffy가 지적했듯이 호출자 $0임의의 값으로 접근 할 수 있습니다 .
위치 이름이 지정된 파일이 비워 둘 $BASH_SOURCE 있습니다. 예 :
echo 'echo "[$BASH_SOURCE]"' | bash

다음 예는이를 설명합니다.

펼쳐 foo:

#!/bin/bash
echo "[$0] vs. [${BASH_SOURCE[0]}]"

$ bash ./foo
[./foo] vs. [./foo]

$ ./foo
[./foo] vs. [./foo]

$ . ./foo
[bash] vs. [./foo]

$0BASH_SOURCE이름에서 알 수있는 사양은 POSIX 셸 사양의 일부인 반면 Bash 전용입니다.


[1] 선택 읽기 : ${BASH_SOURCE[0]}vs.$BASH_SOURCE :

배시는 기준 소자를 허용 0배열 하여 변수 표기 대신 추가 ${arr[0]}하면 쓸 수있다 $arr; 즉, 변수 가 스칼라것처럼 참조하면 index에있는 요소를 얻습니다 0.

이 기능을 사용 $arr하면 배열 이라는 사실이 모호해를 지원합니다. 이것이 인기있는 쉘 코드 linter shellcheck.net 이 다음 경고를 발행하는 이유 입니다 (이 글을 쓰는 시점에서).

SC2128 : 강화없이 배열을 확장하면 첫 번째 요소 만 제공됩니다.

참고 :이 경고는 도움이됩니다. 첫 번째 요소를 반드시 필요는 때문 입니다. 특히 0반환되는 [해석] 색인의 요소 이므로 첫-th 요소가 더 높은 색인을 갖는 경우 - 배쉬에서 가능합니다. 빈 페이지를 나타냅니다. 시도해 시도 'a[1]='hi'; echo "$a"'.
(반면에 zsh, 배신자는 실제로 어느 수행 색인에 관계없이 최초의 요소를 리턴).

실용적으로 말하면, 당신은 무명이 기능을 피하다 임의로 수 있습니다, 그러나 예상 작동 작동, 당신은 거의 경우에 이제까지 접근 필요와 색인없는 것 , 다른0보다 배열 변수의 ${BASH_SOURCE[@]}.


이 펼쳐지는 설명하는 데 도움이 될 수 있습니다. 외부 펼쳐지는 내부 펼쳐보기를 호출하는 중간 펼쳐보기를 호출합니다.

$ cat outer.sh
#!/usr/bin/env bash
./middle.sh
$ cat middle.sh
#!/usr/bin/env bash
./inner.sh
$ cat inner.sh
#!/usr/bin/env bash
echo "\$0 = '$0'"
echo "\${BASH_SOURCE[0]} = '${BASH_SOURCE[0]}'"
echo "\${BASH_SOURCE[1]} = '${BASH_SOURCE[1]}'"
echo "\${BASH_SOURCE[2]} = '${BASH_SOURCE[2]}'"
$ ./outer.sh
$0 = './inner.sh'
$BASH_SOURCE[0] = './inner.sh'
$BASH_SOURCE[1] = ''
$BASH_SOURCE[2] = ''

그러나 펼쳐 호출을 source문으로 변경하면 :

$ cat outer.sh
#!/usr/bin/env bash
source ./middle.sh
$ cat middle.sh
#!/usr/bin/env bash
source ./inner.sh
$ cat inner.sh
#!/usr/bin/env bash
echo "\$0 = '$0'"
echo "\${BASH_SOURCE[0]} = '${BASH_SOURCE[0]}'"
echo "\${BASH_SOURCE[1]} = '${BASH_SOURCE[1]}'"
echo "\${BASH_SOURCE[2]} = '${BASH_SOURCE[2]}'"
$ ./outer.sh
$0 = './outer.sh'
$BASH_SOURCE[0] = './inner.sh'
$BASH_SOURCE[1] = './middle.sh'
$BASH_SOURCE[2] = './outer.sh'

참고 URL : https://stackoverflow.com/questions/35006457/choosing-between-0-and-bash-source

반응형