foo
`-- bar\ with\ space
|-- bcp_core.sh
|-- bcp_main.sh
|-- bcp_query_test.sh
`-- second_test.sh
bcp_core.sh
dir_name=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)
source "${dir_name}"/bcp_query_test.sh
get_date() {
date --utc --date="$1" +"%Y-%m-%d" # +"%Y-%m-%d %H:%M:%S"
}
function func1 {
echo "Hello from bcp_core: $1"
}
bcp_main.sh
dir_name=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)
source "${dir_name}"/bcp_core.sh
func1 "I am passing this"
bcp_query_test.sh
dir_name=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)
echo "Hello from bcp_query_test.sh"
second_test.sh
dir_name=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)
source "${dir_name}"/bcp_main.sh
внутри foo
> source bar\ with\ space/second_test.sh
Hello from bcp_query_test.sh
Hello from bcp_core: I am passing this
> cd bar\ with\ space/
> source second_test.sh
Hello from bcp_query_test.sh
Hello from bcp_core: I am passing this
Почемуdir_name
В Linux вы можете легко получить полный путь к файлу с помощью realpath
. macOS не предоставляет realpath
- вы можете играть с brew
, чтобы получить его на доске.
Вот почему нам нужно играть с ${BASH_SOURCE[0]}
и pwd
, чтобы получить реальный путьскрипт, так что мы действительно можем знать, где он находится.
zsh / bash
Также обратите внимание, что zsh
- это оболочка по умолчанию в macOS, начиная с 10.15.1 - в этом контексте ведет себя намного лучше.
Если у вас есть простой скрипт
echo $0
echo $(dirname $0)
, он будет вести себя по-разному в bash
и zsh
. В zsh
это имеет немного больше смысла.
# bash
> source bar/simple.sh
bash
.
# zsh
> source bar/simple.sh
bar/simple.sh
bar