вызвать файл.csh из файла.sh

Это случилось со мной, проблема заключалась в том, что systemd не был обновлен до версии, совместимой с конфигурацией mariadb.service. Я обновил systemd до 241 и все заработало.

0
28.11.2020, 20:32
2 ответа

Вы можете выполнитьb.cshиз a.sh, точно так же, как вы можете выполнить любую программу, например grepили cat.

Вы не можете ожидать, что выполнение b.cshдобавит какие-либо переменные в среду работающей оболочкиa.sh--b.csh будет выполняться в дочернем процессе, а дочернему процессу не разрешено изменять среду родительского процесса (это базовая безопасность ).

Если вам нужно передать данные из b.csh, то b.csh должен распечатать эти данные, а a.sh может захватить их с помощью подстановки команд :data=$(b.csh)--, хотя вам, вероятно, придется удалите опцию -xиз строки csh shebang, чтобы уменьшить шум.

1
18.03.2021, 22:46

Если написать

./script.sh

Вы сообщаете своей оболочке, что она должна запустить скрипт ./script.sh. Но оболочка не знает, как следует запускать ./script.sh. Это скрипт bash? Может быть, это csh? Или, возможно, это двоичный файл ELF, например ls? Или, может быть, скрипт python. Чтобы узнать это, ОС будет смотреть на первые байты файла. Если он находит шебанг, это означает, что он должен обработать этот файл в программе, указанной в шебанге.

Итак, если первая строка вашего скрипта

#!/usr/bin/bash
...

Он будет обрабатывать файл в программе с именем bashв каталоге /usr/bin, эффективно выполняя bash./script.sh.

Но если вы пишете sh./path/to/b.csh, вы напрямую обрабатываете файл в программе с именем sh. shпроигнорирует первую строку, так как бывает, что он интерпретирует строки, начинающиеся с #, как комментарии.

Итак, вам следует писать не sh./path/to/b.csh, а ./path/to/b.csh, если вы хотите, чтобы шебанг соблюдался.

Обратите внимание, что это создаст новый процесс для запуска скрипта. Если вы хотите запускать каждую строку в ./path/to/b.csh, как если бы она была написана непосредственно в a.sh, вам следует вместо этого сделатьsource./path/to/b.csh(или ../path/to/b.csh, чтобы быть переносимым ). Но он также будет игнорировать шебанг, и каждая строка будет оцениваться как команда sh, а не как csh.

0
18.03.2021, 22:46

Теги

Похожие вопросы