다음과 같은 문제가 있습니다. 내 쉘 스크립트에는 다음과 같은 내용이 포함되어 있습니다.
mydir=''
# config load
source $mydir/config.sh
.... execute various commands
내 스크립트는 내 사용자 디렉토리에 있습니다./home/bob/script.sh
내가 /home/bob
디렉토리 안에 있고 실행하면 ./script.sh
모든 것이 잘 작동합니다.
외부에 있고 절대 경로를 사용하려는 경우 /home/bob/script.sh
config.sh 파일이 올바르게 호출되지 않습니다.
$mydir
각 경로에서 스크립트를 쉽게 실행하려면 어떤 값을 할당해야 합니까?
mydir=$(which command?)
추신: 보너스로 스크립트 디렉터리가 $PATH 내에 있는 경우 대안을 제공하십시오.
답변1
이 $0
변수에는 스크립트 경로가 포함되어 있습니다.
$ cat ~/bin/foo.sh
#!/bin/sh
echo $0
$ ./bin/foo.sh
./bin/foo.sh
$ foo.sh
/home/terdon/bin/foo.sh
$ cd ~/bin
$ foo.sh
./foo.sh
보시다시피 출력은 호출 방법에 따라 다르지만 항상 스크립트가 실행된 방법과 관련된 스크립트 경로를 반환합니다. 그래서 당신은 이것을 할 수 있습니다 :
## Set mydir to the directory containing the script
## The ${var%pattern} format will remove the shortest match of
## pattern from the end of the string. Here, it will remove the
## script's name,. leaving only the directory.
mydir="${0%/*}"
# config load
source "$mydir"/config.sh
디렉토리가 귀하의 디렉토리에 있으면 $PATH
상황이 더욱 간단해집니다. 실행할 수 있습니다 source config.sh
. 기본적으로 source
디렉터리에서 파일을 검색 $PATH
하고 찾은 첫 번째 파일을 가져옵니다.
$ help source
source: source filename [arguments]
Execute commands from a file in the current shell.
Read and execute commands from FILENAME in the current shell. The
entries in $PATH are used to find the directory containing FILENAME.
If any ARGUMENTS are supplied, they become the positional parameters
when FILENAME is executed.
귀하의 콘텐츠가 고유하다고 확신하거나 config.sh
적어도 에서 처음으로 발견된 콘텐츠라면 $PATH
해당 콘텐츠를 얻을 수 있습니다. 하지만 이 방법을 사용하지 말고 첫 번째 방법을 고수하는 것이 좋습니다. 언제 다른 사람이 config.sh
당신을 위해 나타날지 알 수 없습니다 $PATH
.
답변2
이 방법은오직다음에서 유용함배쉬 스크립트.
사용:
mydir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" > /dev/null && pwd )"
작동 방식:
BASH_SOURCE
FUNCNAME
배열 변수에 해당 쉘 함수 이름을 정의하는 소스 파일 이름이 멤버인 배열 변수입니다.
따라서 다음을 사용합니다.
cd "$( dirname "${BASH_SOURCE[0]}" )"
스크립트가 위치한 디렉토리로 이동합니다.
그런 다음 의 출력이 cd
로 전송됩니다 /dev/null
. 왜냐하면 때로는 STDOUT에 무언가를 인쇄하기 때문입니다. 예를 들어 다음과 같은 $CDPATH
경우.
마지막으로 다음을 실행합니다.
pwd
현재 위치를 가져옵니다.
원천:
답변3
해결책을 찾았습니다.
mydir=$(dirname "$0")
이렇게 하면 어디서든 문제 없이 스크립트를 호출할 수 있습니다.
답변4
이 시도테스트를 거쳤습니다.그리고 검증됨주택 검사해결책:
mydir="$(dirname "${0}")"
source "${mydir}"/config.sh
printf "read value of config_var is %s\n" "${config_var}"
시험을 치르다:
$ ls
script.sh
config.sh
$ cat script.sh
#!/bin/bash --
mydir="$(dirname "${0}")"
source "${mydir}"/config.sh
printf "read value of config_var is %s\n" "${config_var}"
$ cat config.sh
config_var=super_value
$ mkdir "$(printf "\1\2\3\4\5\6\7\10\11\12\13\14\15\16\17\20\21\22\23\24\25\26\27\30\31\32\33\34\35\36\37\40\41\42\43\44\45\46\47testdir" "")"
$ mv *.sh *testdir
$ *testdir/script.sh
read value of config_var is super_value