Команда source

Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.

Модератор: Bizdelnick

Ответить
Iisus
Сообщения: 214
ОС: Ubuntu 19.04
Контактная информация:

Команда source

Сообщение Iisus »

добрый день! Не могу понять как эта команда работает?
То есть она как то со скриптом связанна.
Можете привести примеры выполнения этой команды.
Заранее благодарен.
Учиться и еще раз учиться!
https://vk.com/orenburgit
Спасибо сказали:
Aliech
Сообщения: 952
Статус: дилетант широкого профиля
ОС: Gentoo arm64 musl hardened
Контактная информация:

Re: Команда source

Сообщение Aliech »

Вы если запустите из скрипта другой скрипт, то это породит ещё один процесс, который и будет обрабатывать новый файл.

Код: Выделить всё

source путь_до_файла
и

Код: Выделить всё

. путь_до_файла
выполнят содержимое в рамках текущего процесса. Отличный вариант для инклуда частей скрипта по ситуации...
С уважением,
Павел Алиев
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Команда source

Сообщение Bizdelnick »

Неплохо бы уточнить, идёт ли речь о встроенной команде bash или о какой-то другой.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Iisus
Сообщения: 214
ОС: Ubuntu 19.04
Контактная информация:

Re: Команда source

Сообщение Iisus »

Bizdelnick писал:
24.01.2020 19:59
Неплохо бы уточнить, идёт ли речь о встроенной команде bash или о какой-то другой.
Добрый день! Уважаемый,а что есть варианты?
Учиться и еще раз учиться!
https://vk.com/orenburgit
Спасибо сказали:
Iisus
Сообщения: 214
ОС: Ubuntu 19.04
Контактная информация:

Re: Команда source

Сообщение Iisus »

Aliech писал:
24.01.2020 19:41
Вы если запустите из скрипта другой скрипт, то это породит ещё один процесс, который и будет обрабатывать новый файл.

Код: Выделить всё

source путь_до_файла
и

Код: Выделить всё

. путь_до_файла
выполнят содержимое в рамках текущего процесса. Отличный вариант для инклуда частей скрипта по ситуации...
Добрый день! Уважаемый не понял что значит инклуда?
Учиться и еще раз учиться!
https://vk.com/orenburgit
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2604
ОС: Gentoo

Re: Команда source

Сообщение ormorph »

Iisus писал:
24.01.2020 22:07
Добрый день! Уважаемый не понял что значит инклуда?
Он имел в виду, что выполняется аналогия как в си директива #include, которая вставляет текст из файла на месте объявления этой директивы. Только тут существует разница. Команда source просто выполняет команды в текущем процессе bash, при этом не требуются права на выполнение файла в котором прописаны команды, в принципе можно представить что команда source просто подставляет на место ее объявления текст из файла.

пример
файл test1:
Spoiler

Код: Выделить всё

#!/bin/bash

A=10
source test2.sh
echo "B=$B"
файл test2.sh:
Spoiler

Код: Выделить всё

echo "A=$A"
B=20
Остаётся только файлу test1.sh дать права на выполнение и выполнить его.
Последний раз редактировалось ormorph 06.02.2020 20:11, всего редактировалось 1 раз.
Спасибо сказали:
Iisus
Сообщения: 214
ОС: Ubuntu 19.04
Контактная информация:

Re: Команда source

Сообщение Iisus »

добрый день! Что то я не пойму 1.sh
1. Строка?
2. Строка переменной А присваивается значение 10
3. Строка что делает?
4. Строка как она выведет если ничего нет в переменной В?
Учиться и еще раз учиться!
https://vk.com/orenburgit
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3729
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2
Контактная информация:

Re: Команда source

Сообщение Hephaestus »

Iisus писал:
01.02.2020 23:14
1. Строка?
Скрипт можно запускать разными способами.
Можно явно указать интерпретатор:
sh test1.sh или bash test1.sh

А можно файлу скрипта дать права на исполнение и запускать его как ./test1.sh
Вот запись в первой строке нужна как раз на этот случай: она определяет каким интерпретатором обрабатываются строки при "непосредственном" запуске. Такая практика применяется не только для bash-скриптов, но и скриптов на других языках, например, perl, python, sed.
Iisus писал:
01.02.2020 23:14
2. Строка переменной А присваивается значение 10
Да.
Iisus писал:
01.02.2020 23:14
3. Строка что делает?
"Подгружает" содержимое скрипта test2.sh для дальнейшего выполнения.
Iisus писал:
01.02.2020 23:14
4. Строка как она выведет если ничего нет в переменной В?
Переменная B определяется в test2.sh, который "подгружается" на предыдущем шаге.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
Iisus
Сообщения: 214
ОС: Ubuntu 19.04
Контактная информация:

Re: Команда source

Сообщение Iisus »

добрый день! Что то вы меня запутали уважаемые?

Код: Выделить всё

/home/ildar
ildar@ROBOT-1:~$ mkdir test
ildar@ROBOT-1:~$ cd test/
ildar@ROBOT-1:~/test$ ls
ildar@ROBOT-1:~/test$ nano test1.sh
ildar@ROBOT-1:~/test$ nano test2.sh
ildar@ROBOT-1:~/test$ cat test1.sh 
#!/bin/bash

A=10
source test2.sh
echo "B=$B
ildar@ROBOT-1:~/test$ cat test2.sh 
echo "A=$A"
B=20
ildar@ROBOT-1:~/test$ chmod +x test1.sh 
ildar@ROBOT-1:~/test$ chmod +x test2.sh 
ildar@ROBOT-1:~/test$ ./test1
bash: ./test1: Нет такого файла или каталога
ildar@ROBOT-1:~/test$ ./test1.sh
A=10
./test1.sh: строка 5: неожиданный конец файла во время поиска «"»
./test1.sh: строка 6: синтаксическая ошибка: неожиданный конец файла
ildar@ROBOT-1:~/test$ 

Добавлено (20:06):
зачем во втором скрипте переменная B?
Учиться и еще раз учиться!
https://vk.com/orenburgit
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2604
ОС: Gentoo

Re: Команда source

Сообщение ormorph »

Iisus писал:
06.02.2020 20:05
Что то вы меня запутали уважаемые?
Не совсем)
Там ошибка в файле test1.sh, отсутствуют закрывающие кавычки в команде echo -последняя строка. Уже подправил пример.
Спасибо сказали:
Iisus
Сообщения: 214
ОС: Ubuntu 19.04
Контактная информация:

Re: Команда source

Сообщение Iisus »

добрый день! Получается как бы скрипт номер 2 выполняется в 1 скрипте что ли так?

Код: Выделить всё

ildar@ROBOT-1:~/test$ ./test1.sh
A=10
B=20
ildar@ROBOT-1:~/test$ cat test1.sh 
#!/bin/bash

A=10
source test2.sh
echo "B=$B"
ildar@ROBOT-1:~/test$ cat test2.sh 
echo "A=$A"
B=20
ildar@ROBOT-1:~/test$ 
Добавлено (20:58):
Добрый день! А что будет делать команда если просто в терминале писать source?
Учиться и еще раз учиться!
https://vk.com/orenburgit
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2604
ОС: Gentoo

Re: Команда source

Сообщение ormorph »

Iisus писал:
06.02.2020 20:50
добрый день! Получается как бы скрипт номер 2 выполняется в 1 скрипте что ли так?
Точнее команды скрипта номер 2 выполняются в скрипте номер 1. Ну и права на выполнение файлу со скриптом номер 2 давать не обязательно.
Спасибо сказали:
Iisus
Сообщения: 214
ОС: Ubuntu 19.04
Контактная информация:

Re: Команда source

Сообщение Iisus »

А если пример какой-нибудь со скриптом где сначала source пишется?
Учиться и еще раз учиться!
https://vk.com/orenburgit
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2604
ОС: Gentoo

Re: Команда source

Сообщение ormorph »

Iisus писал:
06.02.2020 20:50
Добрый день! А что будет делать команда если просто в терминале писать source?
В терминале не желательно выполнять скрипты командой source, так как переменное окружение скрипта в таком случае будет влиять на переменное окружение текущего процесса bash запущенного в терминале. Т.е. команда source по большей части нужна когда необходимо использовать переменное окружение из другого файла.
Спасибо сказали:
Iisus
Сообщения: 214
ОС: Ubuntu 19.04
Контактная информация:

Re: Команда source

Сообщение Iisus »

Что значит переменное окружение?
Учиться и еще раз учиться!
https://vk.com/orenburgit
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2604
ОС: Gentoo

Re: Команда source

Сообщение ormorph »

Iisus писал:
06.02.2020 21:13
Что значит переменное окружение?
Каждый раз когда запускается терминал, в нем запускается процесс интерпретатора bash, по крайней мере в большинстве дистрибутивов linux именно этот интерпретатор используется по умолчанию. Этот процесс использует уже зарезервированные переменные, просмотреть их содержимое можно выполнив команду env, вот они и называются текущим переменным окружением данного процесса bash. Так вот если задать в скрипте переменные(глобальные) с такими же именами что и в текущем окружении и выполнить скрипт командой source, это приведет к тому что содержимое переменных в текущем процессе bash поменяется, чего не происходит если выполнить скрипт командой ./script.sh.
Хотя если в скрипте первой строкой не указан интерпретатор с помощью которого он запускается:

Код: Выделить всё

#!/bin/bash
Это тоже будет не очень хорошо, так как не будет запущен дочерний процесс bash(новый процесс bash).
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Команда source

Сообщение Bizdelnick »

Iisus писал:
06.02.2020 21:13
Что значит переменное окружение?
Это ничего не значит. Правильно — википедия://переменные окружения. И здесь речь идёт вовсе не о них, а об обычных переменных bash. Команда source к окружению никакого отношения не имеет.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Iisus
Сообщения: 214
ОС: Ubuntu 19.04
Контактная информация:

Re: Команда source

Сообщение Iisus »

Добрый день! Насколько я понял какие то данные хранятся то есть переменные то есть допустим моя домашняя дериктория?

Код: Выделить всё

ildar@ROBOT-1:~$ env
SHELL=/bin/bash
SESSION_MANAGER=local/ROBOT-1:@/tmp/.ICE-unix/1808,unix/ROBOT-1:/tmp/.ICE-unix/1808
COLORTERM=truecolor
XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
XDG_MENU_PREFIX=gnome-
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
GTK_IM_MODULE=ibus
QT4_IM_MODULE=ibus
GNOME_SHELL_SESSION_MODE=ubuntu
SSH_AUTH_SOCK=/run/user/1000/keyring/ssh
XMODIFIERS=@im=ibus
DESKTOP_SESSION=ubuntu
SSH_AGENT_PID=1727
GTK_MODULES=gail:atk-bridge
PWD=/home/ildar
LOGNAME=ildar
XDG_SESSION_DESKTOP=ubuntu
XDG_SESSION_TYPE=x11
GPG_AGENT_INFO=/run/user/1000/gnupg/S.gpg-agent:0:1
XAUTHORITY=/run/user/1000/gdm/Xauthority
GJS_DEBUG_TOPICS=JS ERROR;JS LOG
WINDOWPATH=2
HOME=/home/ildar
USERNAME=ildar
IM_CONFIG_PHASE=1
LANG=ru_RU.UTF-8
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:
XDG_CURRENT_DESKTOP=ubuntu:GNOME
VTE_VERSION=5802
GNOME_TERMINAL_SCREEN=/org/gnome/Terminal/screen/a2c3ad3d_ca1f_4338_aafe_805aef712b93
INVOCATION_ID=105dd47c23ca48e8b81ad8e2fc513bb9
MANAGERPID=1614
CLUTTER_IM_MODULE=ibus
GJS_DEBUG_OUTPUT=stderr
LESSCLOSE=/usr/bin/lesspipe %s %s
XDG_SESSION_CLASS=user
TERM=xterm-256color
LESSOPEN=| /usr/bin/lesspipe %s
LIBVIRT_DEFAULT_URI=qemu:///system
USER=ildar
GNOME_TERMINAL_SERVICE=:1.87
DISPLAY=:0
SHLVL=1
QT_IM_MODULE=ibus
XDG_RUNTIME_DIR=/run/user/1000
JOURNAL_STREAM=9:35694
XDG_DATA_DIRS=/usr/share/ubuntu:/usr/local/share/:/usr/share/:/var/lib/snapd/desktop
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
GDMSESSION=ubuntu
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
_=/usr/bin/env
ildar@ROBOT-1:~$ 
Учиться и еще раз учиться!
https://vk.com/orenburgit
Спасибо сказали:
Ответить