サブシェルが親シェルで何かを実行することは可能ですか?

Aug 20 2020

source現在の環境で一連の環境変数を設定することが目的であるため、dでなければならないシェルスクリプトがあります。

将来私が忘れてしまった場合に備えて、スクリプトは次のように始まります。

#!/usr/bin/env bash

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

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

私が定期的に使用する多くのスクリプトでは、この状況に頻繁に遭遇します。どのスクリプトを入手する必要があるかを覚えておく必要はなく、忘れてしまったときの小さな顔の瞬間も忘れてしまいたいと思います。

スクリプトをソースするようにユーザーに指示する代わりに、スクリプトを呼び出すシェルにスクリプトをソースするように指示する方法はありますか?

私の呼び出しシェルは通常zshですが、zshで不可能な場合は、bashまたはdashと互換性のあるソリューションを受け入れます。スクリプトは現在bashスクリプトとして記述されていますが、必要なことを実行できる場合は、別のシェル(またはシェル以外のシバン互換言語)に変更しても問題ありません。

私は、少なくともいくつかの深刻なシェナニガンなしでは、これは不可能であるという予感があります。

回答

2 StéphaneChazelas Aug 21 2020 at 00:28

ではzsh、あなたは接尾辞の別名を使用することができます(参照info zsh alias詳細)

alias -s zshenv=source

を呼び出すときにsome-file.zshenvsource some-file.zshenvが代わりに実行されることを確認します。

実行可能ファイルを親プロセスに挿入することは、デバッガーを使用して実現できると考えられますが、そこには行きたくありません。