子プロセスにエイリアスを渡す

子プロセスにエイリアスを渡す

/etc/zprofile/etc/profile(またはbash)にはいくつかのエイリアスが定義されています。そこも$PATH操作されました。

作業を避けるシェルからインタラクティブシェルを起動したいと思います$PATH-fオプションを使用して実行します。ただし、親シェルで定義されているエイリアスは役に立つので、それを子プロセスに渡したいと思います。

一度定義されたエイリアスをテキストファイルにコピーして貼り付け、別のシェルを起動するたびにそれをインポートすることは、定義が保持され、時間の経過とともに変更される可能性がある/etc/zprofileため、私が望むものではありません。/etc/zprofile

エイリアスを2番目のシェルに渡す方法に関する提案はありますか?

(私の主な関心は解決策ですが、zsh解決策も気になります)bash

状況がこのように見えます

# log in with ssh
shell1 > echo "here aliases are the way I want them to be"
shell1 > VARIABLE1=value1 VARIABLE2=value2 PATH=some_paths zsh
shell2 > echo "/etc/zprofile prepended something to PATH, which I don't like"
shell2 > echo "aliases are good"
shell2 > exit
shell1 > VARIABLE1=value1 VARIABLE2=value2 PATH=some_paths zsh -f
shell2 > echo "/etc/zprofile did not prepend something to PATH. This is good!"
shell2 > echo "but all aliases from shell 1 are \"forgotten\""
shell2 > exit

情報を説明し続けると、/etc最初に考えたよりも内容が複雑になります。 /etc/zprofile以下の内容が含まれており、それを追跡して私のエイリアスを定義しました。$PATH

_src_etc_profile()
{
    #  Make /etc/profile happier, and have possible ~/.zshenv options like
    # NOMATCH ignored.
    #
    emulate -L ksh

    # source profile
    if [ -f /etc/profile ]; then
        source /etc/profile
    fi
}
_src_etc_profile

unset -f _src_etc_profile

/etc/zshrcしかし、その内容が含まれているという事実を逃しました

_src_etc_profile_d()
{
    #  Make the *.sh things happier, and have possible ~/.zshenv options like
    # NOMATCH ignored.
    emulate -L ksh


    # from bashrc, with zsh fixes
    if [[ ! -o login ]]; then # We're not a login shell
        for i in /etc/profile.d/*.sh; do
        if [ -r "$i" ]; then
            . $i
        fi
        done
        unset i
    fi
}
_src_etc_profile_d

unset -f _src_etc_profile_d

だからそれをzprofile渡すだけでなく/etc/profile.d;zshrcファイルの1つ/etc/profile.dは次のとおりです(どのように進むかについての説明を追加しました)。

if [ -n "$SHLVL" ]; then
    if [ $SHLVL = 1 ]; then
            source /some/group/path/profile
            # calls "source /some/group/path/env"
            # -> see else branch
    else
            source /some/group/path/env
            # calls "source /some/group/path/${SHELL}rc"
            # which then calls
            # "source /my/group/path/group_zshrc"
    fi
else
    echo 'No $SHLVL available, assuming login shell.'
    source /some/group/path/profile
fi

/my/group/path/group_zshrc一時ファイルに書き込み、エイリアスと環境変数を定義/操作してから、最後に一時ファイルをインポートするPythonプログラムを呼び出します。

答え1

/etc/zprofileまたはにエイリアスを定義しないでください~/.zprofile。これらのファイルはログインシェル(もちろん「shell」はzshを表します)からのみロードされます。エイリアスを定義する正しい位置は/etc/zshrcまたはです~/.zshrc。すべての対話型シェルはそれを読みます。

ロードせずにzshを実行するには、オプションなしで実行するだけ/etc/zprofileです。zshこのオプションは-fzshに設定ファイルをまったく読み取らないように指示しますが、エイリアス定義を読み取ろうとするので、これは正しいオプションではありません。/etc/zprofileログインシェルでしか読めないのでいいえオプションを渡します-l(そしてダッシュで始まる0番目の引数を設定しないでください)。

Zshには、起動時に追加ファイルを読み取るためのオプションや環境変数はありません。これに備えたい場合は、これeval $ZSH_EXTRA_STARTUP_CODEをに追加できます.zshrc

readやZDOTDIRなど、さまざまなディレクトリからすべてのユーザー設定ファイルを読み取るように環境変数を設定できます。したがって、現在のインスタンスのエイリアスを子インスタンスにエクスポートするには、次のように実行できます。ZDOTDIR=/tmp/foo zsh/etc/zshenv/tmp/foo/.zshenv/etc/zshrc/tmp/foo/zshrc

tmp=$(mktemp -d)
alias -L >$tmp/.zshenv
echo ". ~/.zshenv; unset ZDOTDIR; rm -r ${(q)tmp}" >>$tmp/.zshenv
zsh

答え2

存在するbash

このオプションを次のように乱用する可能性があります--rcfile

bash --noprofile --rcfile <(alias)

ただし、これをシェルとして使用できるオプションがなければ、--noprofile役に立ちません。-llogin

関連情報