/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
このオプションは-f
zshに設定ファイルをまったく読み取らないように指示しますが、エイリアス定義を読み取ろうとするので、これは正しいオプションではありません。/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
役に立ちません。-l
login