Исходный скрипт одной оболочки в другой выдает ошибку в MacOs - PullRequest
0 голосов
/ 21 ноября 2019

У меня есть следующая структура папок

--/foo 

  --- /foo/bar 

     ---/foo/bar/bcp_main.sh 
    ---/foo/bar/bcp_core.sh
    ---/foo/bar/second_test.sh

Ниже мой скрипт оболочки

second_test.sh

source   $(dirname "$0")/bcp_main.sh

bcp_main.sh

echo "In bcp_main.sh" 
source   $(dirname "$0")/bcp_core.sh
func1

bcp_core.sh

 source   $(dirname "$0")/bcp_query_test.sh

    get_date() {
      date --utc --date="$1" +"%Y-%m-%d"        # +"%Y-%m-%d %H:%M:%S"
    }
function func1 {  
   echo "Hello $1"
}

Источник из second_test.sh в порядке, но источник из bcp_main в bcp_core говорит, что файлне найдено

xxxxx@asj177 ~/Desktop/foo
$ ./bar/second_test.sh
In bcp_main.sh 
: No such file or directory./bar/bcp_core.sh
in bcp main
./bar/bcp_main.sh: line 23: func1: command not found 

Я пытаюсь запустить это на MacOs, я что-то здесь упускаю. Файлы имеют все разрешения.

1 Ответ

0 голосов
/ 21 ноября 2019
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
...