Могу ли я использовать shebang, чтобы иметь исходный файл в текущей среде bash?

Могу ли я использовать shebang, чтобы иметь исходный файл в текущей среде bash?

У меня есть растущая коллекцияскриптыкоторыйследует искать, а не запускать. В данный момент у них есть притон

#! /bin/cat

но я бы предпочел, чтобы они были переданы в bash при запуске, так же, как я это сделал

$ . /path/to/script.sh

или

$ source /path/to/script.sh

Но есть .ли sourceвстроенные функции bash, так возможна ли альтернативная строка shebang для таких скриптов?

решение1

Нет. К тому времени, как в игру вступает shebang, вы уже проиграли. Shebang применяется, когда процесс exec()'d, и обычно это происходит после разветвления, так что вы уже находитесь в отдельном процессе. Shebang читает не оболочка, а ядро.

решение2

She-bang интерпретируется ядром при выполнении команды, а не оболочкой. Так что к тому времени уже слишком поздно.

Вместо этого вы можете сделать это:

#! /bin/echo Please run (from a Bourne-like shell): .

Или:

#! /bin/sed 2,5!d;s/^#.//
# This script must be sourced from within a shell
# and not executed. For instance with:
# 
#   . path/to/that/script
rest of the script

Чтобы сообщить пользователю, что он сделал неправильно.

Что должно работать на Linux. Замените все пробелы, кроме первого, на один из не-ASCII пробельных символов (например, U+00A0, U+2006...) на некоторых других ОС. Возможно, вам придется адаптировать путь к утилитам echoили sed.

решение3

Как говорит пользователь @muru, это невозможно сделать, поскольку вы уже покинули сеанс оболочки, когда дошли до строки #!-.

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

Я предполагаю, что они устанавливают переменные среды, которые вы используете для какого-то проекта.

Давайте назовем проект subtool(потому что это проект, который у меня есть). Тогда у вас может быть скрипт, который настраивает среду оболочки для проектов, project-envнапример:

#!/bin/bash

PROJECT="$1"
PROJECT_ROOT="$HOME/projects/$PROJECT"

cd "$PROJECT_ROOT" || exit 1
source "$PROJECT.env"

export PS1="[$PROJECT: \W] \$ "
exec bash -i

Бежать с:

$ ./project-env subtool

Это автоматически переместит cdвас в указанную подпапку проекта $HOME/projects, прочитает файл среды проекта, названный subtool.envв данном случае (в котором вы инициализируете переменные), выдаст вам приглашение командной строки для проекта и оставит вас в интерактивном bashсеансе:

[subtool: subtool] $

Когда работа будет сделана, просто exit.

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

решение4

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

Трюк с псевдонимом довольно прост: alias mytool1=". /my/library/mytool1.sh"

Можете ли вы прочитать все в начале? .profile: . /my/library/define_tools.sh

define_mytools.sh: mytool1() { ... содержимое mytool1.sh ... } mytool2() { ...; }

Связанный контент