Перейти к содержимому

Source что за команда

  • автор:

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

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

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

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

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

cyber_eagle
22.02.18 00:50:49 MSK
fsb4000 ★★★★★
( 22.02.18 00:58:25 MSK )

Никак, source только выполняет скрипты.

xaizek ★★★★★
( 22.02.18 01:07:28 MSK )
Ответ на: комментарий от xaizek 22.02.18 01:07:28 MSK

А что это за конструкция

? Это выполнение скрипта до запуска python? Она интерпретируется башем?
cyber_eagle
( 22.02.18 01:39:42 MSK ) автор топика
Ответ на: комментарий от xaizek 22.02.18 01:07:28 MSK

с 11 по 23 строку

cyber_eagle
( 22.02.18 01:44:00 MSK ) автор топика
Ответ на: комментарий от xaizek 22.02.18 01:07:28 MSK

Чот у тебя пятница.

r3lgar ★★★★★
( 22.02.18 06:26:21 MSK )
Ответ на: комментарий от cyber_eagle 22.02.18 01:39:42 MSK
IPR ★★★★★
( 22.02.18 08:25:40 MSK )
Ответ на: комментарий от cyber_eagle 22.02.18 01:39:42 MSK

""" что угодно """

это строка, так что питон это не выполняет.
pawnhearts ★★★★★
( 22.02.18 09:45:41 MSK )
Ответ на: комментарий от cyber_eagle 22.02.18 01:44:00 MSK

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

xaizek ★★★★★
( 22.02.18 12:01:29 MSK )
Ответ на: комментарий от r3lgar 22.02.18 06:26:21 MSK

Открывает, читает и выполняет содержимое.

xaizek ★★★★★
( 22.02.18 12:02:58 MSK )
Ответ на: комментарий от xaizek 22.02.18 12:01:29 MSK

Получается, что команда source пытается выполнить скрипт с помощью bash не смотря на то, что в начале файла находится #!/usr/bin/python -O

cyber_eagle
( 22.02.18 21:24:41 MSK ) автор топика
Ответ на: комментарий от cyber_eagle 22.02.18 21:24:41 MSK

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

xaizek ★★★★★
( 22.02.18 21:28:34 MSK )
Ответ на: комментарий от xaizek 22.02.18 21:28:34 MSK

Да, 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 ★★
( 23.02.18 01:11:54 MSK )
Ответ на: комментарий от aureliano15 23.02.18 01:11:54 MSK

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

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

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

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

xaizek ★★★★★
( 23.02.18 01:20:33 MSK )
Ответ на: комментарий от xaizek 23.02.18 01:20:33 MSK

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

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

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

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

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

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

Команда «.» (точка) или source

Команда «.» (точка) — это синоним команды source , встроенной в оболочку. Часто используется для включения внешних файлов внутри сценария. Рассмотрим в чём заключается суть такого включения на примере файла .bash_profile :

if [ -f ~/.bashrc ] ; then . ~/.bashrc fi

На второй строчке с помощью оператора «.» выполняется содержимое файла ~/.bashrc . Возникает вопрос, почему нельзя обойтись без точки?

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

И наоборот, если скрипт запускается без использования точки, то создаётся копия оболочки, и по завершении скрипта в родительскую оболочку ничего не возвращается — все переменные окружения, созданные в скрипте, безвозвратно теряются.

Действие, когда какая либо команда или сама командная оболочка инициирует (порождает) новый подпроцесс, чтобы выполнить какую либо работу, называется ветвлением (forking) процесса. Новый процесс называется «дочерним» (или «потомком»), а породивший его процесс — «родительским» (или «предком»). В результате и потомок и предок продолжают исполняться одновременно — параллельно друг другу.

Проиллюстрируем сказанное на простом примере. Создадим файл test.sh следующего содержания:

var="Какое-то значение" echo "Внутренняя переменная var = $var"

Если теперь запустить скрипт, то на экран будет выведено значение внутренней переменной скрипта var :

$ ./test.sh Внутренняя переменная var = Какое-то значение

Однако эта переменная не сохранится после завершения работы скрипта и не будет присутствовать в окружении текущей оболочки:

$ echo :$var: ::

Если же запустить скрипт с использованием точки, то он выполнится с тем же результатом. Только переменная var будет доступна среди переменных окружения текущей оболочки:

$ . ./test.sh Внутренняя переменная var = Какое-то значение $ echo :$var: :Какое-то значение:

Дочерняя копия оболочки при использовании точки создаётся только в том случае, когда процесс запускается в фоновом режиме. Это единственное исключение из общего правила.

  • Linux. Утилита xargs
  • Автоматическое подключение по ssh из скрипта
  • Linux. Команда echo
  • Linux. Команда chmod
  • Linux. Команда find
  • Команды type, which, whereis, whatis и locate
  • Linux. Команда wait

Каталог оборудования

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

Производители

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

Функциональные группы

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

Категории блога
Облако тегов

  • 1С:Предприятие (31)
  • API (29)
  • Bash (43)
  • CLI (124)
  • CMS (139)
  • CSS (50)
  • Frontend (75)
  • HTML (66)
  • JavaScript (150)
  • Laravel (72)
  • Linux (171)
  • MySQL (76)
  • PHP (125)
  • React.js (66)
  • SSH (27)
  • Ubuntu (69)
  • Web-разработка (509)
  • WordPress (73)
  • Yii2 (69)
  • БазаДанных (95)
  • Битрикс (66)
  • Блог (29)
  • Верстка (43)
  • ИнтернетМагаз… (84)
  • КаталогТоваров (87)
  • Класс (30)
  • Клиент (28)
  • Ключ (28)
  • Команда (88)
  • Компонент (60)
  • Конфигурация (66)
  • Корзина (32)
  • ЛокальнаяСеть (32)
  • Модуль (34)
  • Навигация (31)
  • Настройка (143)
  • ПанельУправле… (29)
  • Плагин (33)
  • Пользователь (26)
  • Практика (101)
  • Сервер (77)
  • Событие (28)
  • Теория (106)
  • Установка (67)
  • Файл (51)
  • Форма (58)
  • Фреймворк (192)
  • Функция (36)
  • ШаблонСайта (68)

Команда source в Bash

source команда считывает и выполняет команды из файла, указанного в качестве аргумента в текущей среде оболочки. Полезно загружать функции, переменные и файлы конфигурации в сценарии оболочки.

source — это оболочка, встроенная в Bash и другие популярные оболочки, используемые в операционных системах Linux и UNIX. Его поведение может немного отличаться от оболочки к оболочке.

Синтаксис команды source

Синтаксис source команды следующий:

source FILENAME [ARGUMENTS] . FILENAME [ARGUMENTS] 
  • source и . (точка) — это та же команда.
  • Если FILENAME не является полным путем к файлу, команда будет искать файл в каталогах, указанных в $PATH среды $PATH . Если файл не найден в $PATH , команда будет искать файл в текущем каталоге.
  • Если заданы какие-либо ARGUMENTS , они станут позиционными параметрами для FILENAME .
  • Если FILENAME существует, source выхода source команды равен 0 , в противном случае, если файл не найден, он вернет 1 .

Примеры команды source

В этом разделе мы рассмотрим несколько основных примеров использования source команды.

Функции поиска

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

В этом примере мы создадим файл, который включает функцию bash, которая проверяет, является ли пользователь, запускающий скрипт, корневым, и если нет, он показывает сообщение и завершает скрипт.

functions.sh

check_root ()  if [[ $EUID -ne 0 ]]; then echo "This script must be run as root" exit 1 fi > 

Теперь в каждом скрипте, который должен запускаться только пользователем root, просто укажите файл functions.sh и вызовите функцию:

#!/usr/bin/env bash source functions.sh check_root echo "I am root" 

Если вы запустите приведенный выше сценарий как пользователь без полномочий root, он напечатает «Этот сценарий должен быть запущен от имени пользователя root» и завершится.

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

Файл конфигурации Bash

С помощью source команды вы также можете читать переменные из файла. Переменные должны быть установлены с использованием синтаксиса Bash, VARIABLE=VALUE .

Создадим тестовый файл конфигурации:

VAR1="foo" VAR2="bar" 

В вашем сценарии bash используйте команду source для чтения файла конфигурации:

#!/usr/bin/env bash source config.sh echo "VAR1 is $VAR1" echo "VAR2 is $VAR2" 

Если вы запустите сценарий, результат будет выглядеть так:

VAR1 is foo VAR2 is bar 

Выводы

В этом руководстве вы узнали, как использовать встроенную команду source в сценариях оболочки.

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

Команда source. Как работает и для чего она в Linux?

websofter

у тебя в скрипте допустим
MY_VARIABLE=»HELLO WORLD»
если запустить bash script.sh, а потом выполнить echo $MY_VARIABLE будет пустая строка
если source, у тебя будет объявлена переменная MY_VARIABLE в текущем шеле (echo $MY_VARIABLE посмотри)

скрипт activate по сути меняет тебе переменные в текущей оболочке $PATH (где искать исполняемые файлы) и $PS1 ( как выглядит твой шелл)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *