LINUX.ORG.RU

Как работает команда source???

 , , ,


0

1

Всем здоровья! Смущает меня странная работа команды source ".".

Тккак в директориях из PATH я ее не нашел, то скорее всего она встроена в bash. Тогда понятно как она запускает скрипты...

НО только что я попробовал запустить 'source ranger' - он выполнился и поменял текущую директорию после закрытия. Хотя это вовсе не bash скрипт (он написан на python). Так же оказалось, что source ranger запускает python ranger в дочернем процессе bash (те ничем не отличается от обычного запуска без source)...

Каким образом она запускает скрипт (в частности python) так, чтобы потом получить его переменные окружения, и почему она отказывается запускать бинарные файлы, если python так же запускается как дочерний процесс??

Ответ на: комментарий от cyber_eagle

Как уже сказали это многострочный строковой литерал в питоне, оболочка игнорирует так как после обработки кавычек получается :, а это что-то вроде символа комментария для оболочки.

xaizek ★★★★★ ()
Ответ на: комментарий от cyber_eagle

Да, source на #! вообще не смотрит, а предполагает, что в файле команды оболочки и исполняет их в текущем шеле, вроде того как если бы пользователь их последовательно по одной вводил.

xaizek ★★★★★ ()
Ответ на: комментарий от xaizek

Да, source на #! вообще не смотрит, а предполагает, что в файле команды оболочки

Кстати, тогда должны начаться ошибки после питоновского кода:

$ """
> from __future__ import (absolute_import, division, print_function)
> 
> import sys
> 
> # Need to find out whether or not the flag --clean was used ASAP,
> # because --clean is supposed to disable bytecode compilation
> ARGV = sys.argv[1:sys.argv.index('--')] if '--' in sys.argv else sys.argv[1:]
> sys.dont_write_bytecode = '-c' in ARGV or '--clean' in ARGV
> 
> # Start ranger
> import ranger  # NOQA pylint: disable=import-self,wrong-import-position
> sys.exit(ranger.main())  # pylint: disable=no-member
> "
bash: $'\nfrom __future__ import (absolute_import, division, print_function)\n\nimport sys\n\n# Need to find out whether or not the flag --clean was used ASAP,\n# because --clean is supposed to disable bytecode compilation\nARGV = sys.argv[1:sys.argv.index(\'--\')] if \'--\' in sys.argv else sys.argv[1:]\nsys.dont_write_bytecode = \'-c\' in ARGV or \'--clean\' in ARGV\n\n# Start ranger\nimport ranger  # NOQA pylint: disable=import-self,wrong-import-position\nsys.exit(ranger.main())  # pylint: disable=no-member\n': команда не найдена

Можно было, конечно, не вводить последнюю кавычку, но тогда такой код сгодится только для завершения скрипта.

И вопрос по питону: как он обрабатывает 4 кавычки подряд и двоеточие перед командами bash'а? Я не нашёл.

aureliano15 ()
Ответ на: комментарий от aureliano15

Кстати, тогда должны начаться ошибки после питоновского кода:

Нет, там же есть return, который прекращает обработку файла.

И вопрос по питону: как он обрабатывает 4 кавычки подряд и двоеточие перед командами bash'а?

Выше же есть, это многострочный строковой литерал (документация), который начинается с трёх кавычек.

xaizek ★★★★★ ()
Ответ на: комментарий от xaizek

Кстати, тогда должны начаться ошибки после питоновского кода:

Нет, там же есть return, который прекращает обработку файла.

Да, невнимательно смотрел.

И вопрос по питону: как он обрабатывает 4 кавычки подряд и двоеточие перед командами bash'а?

Выше же есть, это многострочный строковой литерал (документация), который начинается с трёх кавычек.

Про 3 кавычки я читал. Просто там 4 стоит. Но сейчас понял, что 4-я, видимо, с точки зрения питона является частью текста и может даже не экранироваться.

aureliano15 ()