На этот вопрос уже есть ответ здесь:
Я всегда запускал скрипты, используя ./
Например ./script.sh
Недавно узнал, что можно также набирать . script.sh
Есть ли разница?
Второй вариант для меня намного проще, так как на моей клавиатуре нет клавиши для /, а нужно нажимать SHIFT -
.
Когда Вы делаете ./script.sh
, скрипт запущен в подоболочке. Таким образом, любая операция/изменение, которую сценарий предназначен, чтобы сделать, происходится в подоболочке, следовательно родительская оболочка, т.е. от оболочки от сценария назвали, остается незатронутым из изменений.
, С другой стороны, когда Вы делаете . script.sh
(.
совпадает с оболочкой, встроенной source
), сценарий является источником, означающим, что все команды выполняются в этом экземпляре оболочки (от которого это называют). Следовательно любые изменения в атрибутах, таких как переменные, объявление функций влияет на оболочку.
Обычно source
используется для пользовательских конфигурационных файлов, например, ~/.bashrc
после создания любой модификации к нему, например, добавления нового пути к PATH
, так, чтобы изменение было применено от текущей сессии оболочки.
, Возможно, пример сделает Вас более ясными:
$ cat script.sh ##Our test script, containing just a variable (spam) declaration
#!/bin/bash
spam=foobar
$ ./script.sh ## Execute using ./script.sh
$ echo "$spam" ## Prints nothing
$ . script.sh ## Lets source it
$ echo "$spam" ## Now we get it
foobar
Оба выполняют сценарий, который расположен в том же каталоге, что Вы находитесь в, т.е. Ваш текущий рабочий каталог.
Выполнение . script
упоминается как определение источника сценария в bash
Из http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x237.html
Когда файл получен (путем ввода или исходного имени файла или. имя файла в командной строке), строки кода в файле выполняются, как будто они были распечатаны в командной строке. Это особенно полезно со сложными подсказками, чтобы позволить им быть сохраненными в файлах и призванными путем определения источника файла, в котором они находятся.
В примерах Вы найдете, что я часто включаю #!/bin/bash в начале файлов включая функции. Это не необходимо при определении источника файла так же, как это не необходимо для chmod +x файл, который будет полученным. Я делаю это, потому что это делает Vim (мой предпочтительный редактор, никакие провокационные сообщения - Вы используете то, что Вы любите), думают, что я редактирую сценарий оболочки и включаю цветную подсветку синтаксиса.
Существует точка для замечания: сценарий выполняется, как будто он был введен на командной строке, означая, что он ожидает bash
синтаксис. Таким образом, если Вы в настоящее время работаете в bash
и Вы хотите выполнить сценарий, который записан в tcsh
стиль, удар будет жаловаться. В отличие от этого, если Вы делаете . bashstylescript.sh
это будет работать.
Вот демонстрация этого. cwhile.sh
находится в tcsh
стиль и whileloop.sh
находится в bash
стиль.
serg@ubuntu [/home/xieerqi]
================================
$ . cwhile.sh
bash: cwhile.sh: line 8: syntax error: unexpected end of file
serg@ubuntu [/home/xieerqi]
================================
$ . whileloop.sh
28206
33672
18406
65344
12022
10751
29707
44303
15081
59236
Что относительно ./script
? В этом случае оболочка будет читать #!
строка, и выполненный соответствующая оболочка для выполнения сценария.
serg@ubuntu [/home/xieerqi]
================================
$ ./cwhile.sh
Welcome 1 times
Welcome 2 times
Welcome 3 times
Welcome 4 times
Welcome 5 times
Как Вы видите, оболочка читает мой #!/bin/tcsh
строка и позволяет tcsh
выполните сценарий.
Заметка на полях: выполнение . script.sh
в других оболочках не мог бы работать, так как это, кажется, удар только вещь. mksh
например, не делает этого, а скорее использования source script.sh
путь