Сегодня я следовал некоторым инструкциям для установки программного обеспечения в Linux. Был скрипт, который должен быть запущен сначала. Это устанавливает некоторые переменные среды.
Инструкция сказала мне выполняться . ./setup.sh
, но я сделал ошибку путем выполнения ./setup.sh
. Таким образом, ENV не был установлен. Наконец я заметил это и продолжил двигаться.
Я хочу знать различие между этими двумя методами вызова сценария. Я абсолютно плохо знаком с Linux поэтому быть максимально тщательно продуманным.
./setup.sh
запускает скрипт, будет запущена новая оболочка, которая выполняет скрипт. Эта новая оболочка не может повлиять на родительскую оболочку, которая запустила сценарий.
. ./setup.sh
является сокращением для source ./setup.sh
и запускает сценарий в текущей оболочке, вместо того, чтобы запускать новую оболочку для его выполнения. Это означает, что сценарий может изменять поведение текущей оболочки, например, устанавливать новые переменные окружения.
Просто запустите "source /path/to/setup.sh
"
Это установит переменные окружения в текущей оболочке.
Edit: Я только что понял, что не ответил на другую часть вашего вопроса ... но ответ Лироя делает это. Я вроде как ответил на кое-что еще, но надеюсь, что это поможет: -)
Функция sh
запускает bash в сценарии, который вы ее представляете. См. страницу руководства для получения дополнительной информации, но вы можете видеть, что sh
в основном является синонимом для bash
, когда вы запускаете сценарий ala ./ setup. sh
он идентифицирует сценарий на основе того, что находится в верхней части файла, обычно называется "Shebang"
. В сценарии bash должно быть
#!/bin/sh
или что-то подобное в верхней части файла, что позволяет использовать точечный метод. Вы также можете использовать другие вещи, например, скрипт Python может иметь
#!/usr/bin/env/python
. И если ваш путь правильный, он будет запускать скрипт как скрипт Python, а не как скрипт bash, используя точечную нотацию.
Надеюсь, что это объясняет просто!
.
относится к текущему каталогу. Итак, ./ script.sh
означает запуск сценария в текущем каталоге.
../ script.sh
запустит script.sh в родительском каталоге.
. ./script.sh
(с пробелом между точками) будет жаловаться в некоторых оболочках, таких как csh, но в bash . foo
- это сокращение для исходного текста foo
.