Разница между & ldquo; ./& rdquo; и & ldquo ;. & Rdquo; для запуска скрипта / приложения? [Дубликат]

Этот вопрос уже имеет ответ здесь: Какая разница между “ source x & rdquo ;, & ldquo ;. х & Rdquo; и “. / x ” в Баше? 3 ответа

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

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

Недавно я узнал, что вы также можете ввести . script.sh [!d8 ]

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

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

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

1 ответ

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

Выполнение . script называется поиском скрипта в bash [!d1 ]

С http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x237.html

Когда файл получен из источника (путем ввода имени исходного файла или имени файла в команде line) строки кода в файле выполняются так, как если бы они были напечатаны в командной строке. Это особенно полезно при сложных запросах, чтобы они могли храниться в файлах и вызывались путем поиска файла, в котором они находятся. В примерах вы обнаружите, что я часто включаю #! / Bin / bash в начале файлов, включая функции , Это не обязательно, если вы пытаетесь найти файл, так же, как нет необходимости в chmod + x файле, который будет создан. Я делаю это, потому что он делает Vim (мой редактор выбора, без пламени, пожалуйста, вы используете то, что вам нравится), думаю, что я редактирую скрипт оболочки и включаю подсветку синтаксиса цвета.

Следует заметить: сценарий выполняется так, как если бы он был источником сценария , что означает, что он ожидает синтаксис bash. Таким образом, если вы в настоящий момент работаете в bash и хотите выполнить скрипт, написанный в стиле tcsh, bash будет жаловаться. В отличие от этого вы . 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 в других оболочках может не работает, так как это похоже на bash только. mksh, например, этого не делает, а использует source script.sh путь

1
ответ дан 23 May 2018 в 18:12
  • 1
    Это наоборот, . script.sh является стандартным, поэтому он должен поддерживаться большинством оболочек (как стиль bourne, так и стиль csh), тогда как source изначально является башизмом. – jlliagre 15 August 2015 в 00:52
  • 2
    Итак, я думаю, mksh является просто странным и не поддерживает . Script.sh? – Sergiy Kolodyazhnyy 15 August 2015 в 00:59
  • 3
    mksh действительно поддерживает . script.sh – jlliagre 15 August 2015 в 01:09
  • 4
    @jlliagre, тогда почему это не работает для меня? – Sergiy Kolodyazhnyy 15 August 2015 в 01:21
  • 5
    У меня нет объяснений, но я предполагаю ошибку в вашем тестовом случае. AFAIK, mksh всегда поддерживал встроенный модуль .. До этого pdksh уже поддерживал его. Не делать это было бы очень серьезной ошибкой. В любом случае вы не представили никаких доказательств, что это не сработает для вас, но если вы можете опубликовать повторяемый тестовый пример, который может заслужить его собственный вопрос. – jlliagre 15 August 2015 в 03:05

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

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