В чем разница между "./somescript.sh" и "./somescript.sh"

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

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

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

Ответ 1

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

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

Ответ 2

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

Функция sh выполняет bash на script, с которой вы ее представляете. Подробнее см. справочную страницу, но вы можете видеть sh в основном синоним bash

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

A bash script имел бы

#!/bin/sh

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

#!/usr/bin/env/python

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

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

Ответ 3

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

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

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

Ответ 4

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

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