$ 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]
$0
BASH_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
'IT' 카테고리의 다른 글
(Angular-ui-router) 해결 프로세스 중 로딩 애니메이션 표시 (0) | 2020.10.08 |
---|---|
노드 파일의 시작 부분에서“/ usr / bin / env node”는 정확히 무엇을 무엇입니까? (0) | 2020.10.08 |
ASP.NET MVC의 SSL 페이지 (0) | 2020.10.08 |
/ usr / bin / codesign이 종료 코드 1로 실패했습니다. (0) | 2020.10.08 |
최후의 수단의 성능 최적화 전략 (0) | 2020.10.03 |