Разница между "./" и ". " для запуска скрипта/приложения? [duplicate]

На этот вопрос уже есть ответ здесь:

Я всегда запускал скрипты, используя ./

Например ./script.sh

Недавно узнал, что можно также набирать . script.sh

Есть ли разница?

Второй вариант для меня намного проще, так как на моей клавиатуре нет клавиши для /, а нужно нажимать SHIFT -.

3
задан 15 August 2015 в 00:40

2 ответа

Когда Вы делаете ./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
6
ответ дан 1 December 2019 в 13:24

Оба выполняют сценарий, который расположен в том же каталоге, что Вы находитесь в, т.е. Ваш текущий рабочий каталог.

Выполнение . 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 путь

1
ответ дан 1 December 2019 в 13:24

Другие вопросы по тегам:

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