É possível que um subshell execute algo no shell pai?

Aug 20 2020

Eu tenho um script de shell que deve ser sourced, porque seu objetivo é definir um monte de variáveis ​​de ambiente no ambiente atual.

Caso o futuro me esqueça, o script começa com:

#!/usr/bin/env bash

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

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

Eu encontro essa situação com frequência, para muitos scripts que uso regularmente. Eu gostaria de me livrar da necessidade de lembrar quais dos meus scripts precisam ser selecionados, bem como daqueles pequenos momentos em que me esqueço.

Existe uma maneira de o script, em vez de dizer ao usuário para fornecer o script, dizer ao shell de chamada para fornecer o script?

Meu shell de chamada geralmente é zsh, mas eu aceitaria uma solução compatível com bash ou dash se não for possível com zsh. O script está atualmente escrito como um script bash, mas não tenho nenhum problema em alterá-lo para outro shell (ou linguagem não compatível com o shell shebang) se ele puder realizar o que desejo.

Tenho um palpite de que isso não é possível, pelo menos não sem algumas travessuras sérias.

Respostas

2 StéphaneChazelas Aug 21 2020 at 00:28

Com zsh, você pode usar aliases de sufixo (consulte info zsh aliaspara obter detalhes)

alias -s zshenv=source

Para certificar-se de que, quando você invocar some-file.zshenv, source some-file.zshenvseja executado em seu lugar.

Ter um executável injetar código em seu processo pai poderia ser conseguido usando depuradores, mas você não quer ir por aí.