Вызов bash скрипта из соседнего скрипта

Вызов bash скрипта из соседнего скрипта

02.12.2015 03:54:32 Просмотров 61 Источник

В одном каталоге находятся два bash скрипта:

  • a.sh

    #!/bin/bash
    echo "Hello, world"
    
  • b.sh

    #!/bin/bash
    . a.sh
    

При запуске b.sh выскакивает ошибка:

user@comp: source b.sh 
b.sh:2: command not found: a.sh

Подскажите, в чем может быть проблема?

У вопроса есть решение - Посмотреть?

Ответы - Вызов bash скрипта из соседнего скрипта / Вызов bash скрипта из соседнего скрипта

Mike

02.12.2015 04:02:06

В Unix системах шелл при выполнении команд ищет их исключительно в каталогах, указанных в переменной окружения PATH. В текущем каталоге, в отличие от Windows, поиск не происходит.

Если текущий каталог не указан в PATH то скрипты из него необходимо вызывать с указанием на текущий каталог. В вашем случае полная команда вызова будет . ./a.sh

https://ru.stackoverflow.com/questions/471300/%d0%92%d1%8b%d0%b7%d0%be%d0%b2-bash-%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d0%b0-%d0%b8%d0%b7-%d1%81%d0%be%d1%81%d0%b5%d0%b4%d0%bd%d0%b5%d0%b3%d0%be-%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d0%b0/471305#comment527866_471305
Теперь пишет: b.sh:2: command not found: ./a.sh
https://ru.stackoverflow.com/questions/471300/%d0%92%d1%8b%d0%b7%d0%be%d0%b2-bash-%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d0%b0-%d0%b8%d0%b7-%d1%81%d0%be%d1%81%d0%b5%d0%b4%d0%bd%d0%b5%d0%b3%d0%be-%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d0%b0/471305#comment527867_471305
Что легко проверить набрав echo $PATH. Точки там не будет, хотя можно и добавить)
https://ru.stackoverflow.com/questions/471300/%d0%92%d1%8b%d0%b7%d0%be%d0%b2-bash-%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d0%b0-%d0%b8%d0%b7-%d1%81%d0%be%d1%81%d0%b5%d0%b4%d0%bd%d0%b5%d0%b3%d0%be-%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d0%b0/471305#comment527889_471305
Вот, теперь 3 похожих ответа, правда у arexander barakin более правильный. Осталось понять почему у ТС это не работает :)
Является ответом!
aleksandr barakin

02.12.2015 04:15:48

$ cat b.sh
#!/bin/bash
. a.sh

поиск файла a.sh в данном случае будет осуществляться в текущем каталоге.

скорее всего, вы выполняете команду source ...b.sh не в том каталоге, где находится файл a.sh.

если и b.sh и a.sh находятся в одном каталоге, а вам требуется, чтобы команда source ...b.sh выполнялась успешно вне зависимости от того, какой у вашей оболочки текущий каталог, то внутри b.sh можно извлечь путь к нему и подставить при обращении к a.sh. например, так:

$ cat b.sh
#!/bin/bash
d=$(dirname $0)
. ${d}/a.sh

для справки: точка в команде . a.sh — это синоним внутренней команды оболочки source.

https://ru.stackoverflow.com/questions/471300/%d0%92%d1%8b%d0%b7%d0%be%d0%b2-bash-%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d0%b0-%d0%b8%d0%b7-%d1%81%d0%be%d1%81%d0%b5%d0%b4%d0%bd%d0%b5%d0%b3%d0%be-%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d0%b0/471312#comment527869_471312
запускал из того же каталога, что и мои тестовые скрипты.
https://ru.stackoverflow.com/questions/471300/%d0%92%d1%8b%d0%b7%d0%be%d0%b2-bash-%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d0%b0-%d0%b8%d0%b7-%d1%81%d0%be%d1%81%d0%b5%d0%b4%d0%bd%d0%b5%d0%b3%d0%be-%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d0%b0/471312#comment527876_471312
@MichaelPak, приложите, пожалуйста, к вопросу вывод команд ps и /bin/bash --version. заодно посмотрите, на какой файловой системе находятся файлы: df b.sh и с какими опциями эта ф.с. примонтирована: mount | grep /путь/к/файловой/системе.
https://ru.stackoverflow.com/questions/471300/%d0%92%d1%8b%d0%b7%d0%be%d0%b2-bash-%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d0%b0-%d0%b8%d0%b7-%d1%81%d0%be%d1%81%d0%b5%d0%b4%d0%bd%d0%b5%d0%b3%d0%be-%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d0%b0/471312#comment527909_471312
@alexanderbarakin, но b.sh у него ведь запускается, а значит о noexec тут говорить не приходится. Мне кажется, что там банально где-то русская буква попалась. Разве что еще which bash посмотреть.
https://ru.stackoverflow.com/questions/471300/%d0%92%d1%8b%d0%b7%d0%be%d0%b2-bash-%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d0%b0-%d0%b8%d0%b7-%d1%81%d0%be%d1%81%d0%b5%d0%b4%d0%bd%d0%b5%d0%b3%d0%be-%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d0%b0/471312#comment527914_471312
@andy.37, неизвестно, что за оболочку использует автор вопроса, и как она реагирует на команды . и source. потому я и запросил всю пришедшую в голову информацию.
andy.37

02.12.2015 04:31:34

a.sh:

#!/bin/bash
echo hello

b.sh:

#!/bin/bash
./a.sh

Запускаем:

$ chmod +x a.sh b.sh
$ ./b.sh
hello
$

Варианты:

1) a.sh - не исполняемый.

2) запускаете b.sh как some/path/b.sh

3) оба файла не исполняемые запускаете bash b.sh. В нем соотв. надо писать не ./a.sh а bash a.sh. Впрочем для Вашего изначального варианта с . a.sh исполняемость файла не нужна.

4) где-то в одном из мест стоит русская буква "а".

Закрыть X