Может ли подоболочка выполнить что-то в родительской оболочке?

Aug 20 2020

У меня есть сценарий оболочки, который должен быть sourced, потому что его цель - установить кучу переменных среды в текущей среде.

На случай, если в будущем я забуду, сценарий начинается с:

#!/usr/bin/env bash

mustBeSourced() {
  >&2 echo "This script must be sourced."
  exit 1
}

(return 0 2>/dev/null) || mustBeSourced

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

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

Моя вызывающая оболочка обычно zsh, но я бы принял решение, совместимое с bash или dash, если это невозможно с zsh. В настоящее время сценарий написан как сценарий bash, но у меня нет проблем с его заменой на другую оболочку (или язык, не совместимый с оболочкой shebang), если он может выполнить то, что я хочу.

У меня есть подозрение, что это невозможно, по крайней мере, без серьезных махинаций.

Ответы

2 StéphaneChazelas Aug 21 2020 at 00:28

С zsh, вы можете использовать псевдонимы суффиксов (подробнее см. info zsh alias)

alias -s zshenv=source

Чтобы убедиться в том , что при вызове some-file.zshenv, source some-file.zshenvвыполняется вместо.

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