Bash에서 스크립트의 전체 파일 이름을 얻는 방법은 무엇입니까? (파이썬 변수와 유사 __file__
)
그것은 마치
#!/bin/bash
# my-script.sh
# would evaluate to /dir/my-script.sh
thisfile=$(get-name-for-this-script)
# Do something with some other local file
cp $(dirname $thisfile)/something.txt .
답변1
sh와 같은 셸에서 $0
스크립트를 실행할 경로입니다. 이것은 bash 아래에 문서화되어 있습니다.특수 매개변수. 이는 상대 경로일 수 있으며, 이 경우 쉘이 시작될 때 현재 디렉토리에 상대적입니다.
$0
한 스크립트가 다른 스크립트를 사용하거나 실행할 때 변경되지 않습니다 . 현재 실행 중인 코드가 포함된 파일을 나타내는 Python에 더 가까운 것은.
source
__file__
$BASH_SOURCE
. 매뉴얼에는 주제에 대해 그다지 명확하지 않지만 $BASH_SOURCE
함수에 없는 코드의 경우에도 현재 실행되는 줄이 포함된 파일의 이름입니다. $0
와 마찬가지로 $BASH_SOURCE
상대 경로가 될 수 있습니다. 이는 .
내장 명령에 전달되는 모든 경로이며 cd
쉘이 후속 명령을 실행하는 경우 변경되지 않습니다.
답변2
대부분의 답변은 상대 경로를 통해 심볼릭 링크된 파일을 처리하지 않거나 단일 라이너가 아니거나 BSD(Mac)를 처리하지 않습니다. 이 세 가지 문제에 대한 해결책은 다음과 같습니다.
HERE=$(cd "$(dirname "$BASH_SOURCE")"; cd -P "$(dirname "$(readlink "$BASH_SOURCE" || echo .)")"; pwd)
첫째, bash 스크립트 디렉토리에 대한 cd 개념입니다. 그런 다음 파일을 읽고 링크하여 심볼릭 링크(상대 또는 기타)인지 확인하고, 그렇다면 디렉토리로 이동합니다. 그렇지 않은 경우 현재 디렉터리로 이동합니다(간결하게 유지해야 함). 그런 다음 현재 디렉토리를 에코합니다 pwd
.
옵션과 같은 이름의 디렉토리 관련 문제를 피하기 위해 cd 및 readlink에 인수를 추가할 수 있지만 --
대부분의 경우에는 신경쓰지 않습니다.
여기에서 그림과 함께 전체 지침을 볼 수 있습니다(이것은 내 웹사이트입니다).
https://www.binaryphile.com/bash/2020/01/12/OK-the-location-of-your-script-in-bash.html