В чем разница между "./somescript.sh" и "./somescript.sh" - PullRequest
9 голосов
/ 14 апреля 2010

Сегодня я следовал некоторым инструкциям по установке программного обеспечения в Linux. Был скрипт, который нужно запустить первым. Устанавливает некоторые переменные среды.

Инструкция сказала мне выполнить . ./setup.sh, но я допустил ошибку, выполнив ./setup.sh. Таким образом, env не был установлен. Наконец я это заметил и продолжил.

Я хочу знать разницу между этими двумя методами вызова скрипта. Я совершенно новичок в Linux, поэтому, пожалуйста, будьте как можно сложнее.

Ответы [ 4 ]

21 голосов
/ 14 апреля 2010

./setup.sh запускает скрипт, будет запущена новая оболочка, которая запускает скрипт. Эта новая оболочка не может повлиять на родительскую оболочку, которая запустила сценарий.

. ./setup.sh является сокращением для source ./setup.sh, и он будет запускать сценарий в текущей оболочке вместо запуска новой оболочки для его запуска. Это означает, что скрипт может изменить поведение текущей оболочки, например, установить новые переменные среды.

3 голосов
/ 14 апреля 2010

Редактировать: Я только что понял, что не ответил на другую часть вашего вопроса ... но ответ от leeroy делает это. Я вроде ответил на что-то еще, но я надеюсь, что это поможет: -)

Функция sh запускает bash для сценария, с которым вы ее представляете. См. справочную страницу для получения дополнительной информации, но вы можете видеть, что sh - это синоним bash

.

Когда вы запускаете скрипт ala ./setup.sh, он идентифицирует скрипт на основе того, что находится вверху файла, обычно называемого "Шебанг"

скрипт bash будет иметь

#!/bin/sh

Или аналогично в верхней части файла, что позволяет использовать точечный метод. Вы также можете использовать другие вещи, например, скрипт Python может иметь

#!/usr/bin/env/python

И если ваш путь верен, он будет запускать скрипт как скрипт Python вместо bash с использованием точечной нотации.

Надеюсь, это объясняет это просто!

0 голосов
/ 14 апреля 2010

Просто запустите "source /path/to/setup.sh"

Это установит переменные окружения в текущей оболочке.

0 голосов
/ 14 апреля 2010

. относится к текущему каталогу. Таким образом, ./script.sh означает запуск скрипта в текущем каталоге.

../script.sh запустит script.sh в родительском каталоге.

. ./script.sh (с пробелом между точками) будет жаловаться в некоторых оболочках, таких как csh, но в bash . foo является сокращением для source foo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...