Как выполнить скрипт в текущей оболочке в Linux?

Есть ли способ отметить скрипт, который будет выполняться в текущей оболочке из whitin It? Я знаю, что могу использовать:

. ./path/myscript.sh

но мне нужен способ включить «точечный» путь внутри скрипта.

Редактировать: Вот так. У меня есть сценарий «myscript.sh», расположенный в каталоге A:

rm -r A
mkdir A
touch A/test.file
cd A

Когда сценарий выполняется обычным способом:

sh myscript.sh

При выходе из сценария я не могу перечислить каталог. Когда скрипт запущен в текущей оболочке:

. ./myscript.sh

Нет проблем. Мне нужен способ включить этот «точечный» путь внутри моего скрипта, чтобы его можно было вызывать без него.

1
nl ja de
Узнайте о функции bash -s, например. прочитайте tldp.org/LDP/abs/html
добавлено автор Basile Starynkevitch, источник
«Точка» является сокращением для команды «источник». Если я правильно вас понимаю, это невозможно. Сам скрипт не может решить, следует ли его вызывать или использовать, вызывающая оболочка должна это решить.
добавлено автор Rolf Rander, источник

4 ответы

  1. put #!/bin/sh as the first line of the script
  2. Add execute permission i.e. chmod +x /path/to/script.sh

Затем вы можете запустить скрипт

i.e. /path/to/script.sh

or if you have /path/to in the PATH environment variable you can simply execute script.sh

2
добавлено

Существует два способа выполнения скрипта в оболочке. В зависимости от ваших потребностей вам нужно будет выполнить одно из следующих действий (не делайте оба!).

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

Чтобы запустить скрипт как программу:

  • Добавьте строку #!/bin/bash в качестве первой строки скрипта

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

Чтобы запустить сценарий в текущую оболочку:

  • type the command . script.sh or source script.sh

Примечание: . в bash эквивалентно source в bash.

Это действует так, как будто вы ввели содержимое «script.sh». Например, если вы установите переменную в «script.sh», тогда эта переменная будет установлена ​​в текущей оболочке. Вам нужно будет отключить эту переменную, чтобы очистить ее от текущей оболочки.

Это сильно отличается от примера #!/Bin/bash , потому что установка переменной в новом подпроцессе bash не повлияет на оболочку, с которой вы начали подпроцесс.

1
добавлено

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

I found some more details and explanations here: http://steve-parker.org/sh/functions.shtml

1
добавлено

Попробуй это: путь источника/в/shell/script.sh

Он выполнит скрипт оболочки в текущей оболочке.

0
добавлено
Linux Help
Linux Help
2 686 участник(ов)

Правила: https://telegra.ph/Pravila-Linux-Help-10-15

Linux Security
Linux Security
652 участник(ов)

Данная группа принципиально про безопасность и в частности про безопасность Linux. Прочие темы просим обсуждать в профильных чатах.

Linux Gaming RUS
Linux Gaming RUS
28 участник(ов)

Русскоязычный чатик, посвящённый играм на различных дистрибутивах Linux, а также wine, proton Arch Linux RU @ArchLinuxChatRU Gnome RU @gnome_ru