ログインシェルごとに/etc/profile.d/alias.shにエイリアスを設定しました。しかし、script.shを実行すると、そのエイリアスを使用できなくなります。サブシェルまたは子プロセスに対してもエイリアスを設定するにはどうすればよいですか?
/etc/profile.d/alias.sh
alias rmvr='rm -rv';
alias cprv='cp -rv';
alias mvrv='mv -rv';
エイリアスは継承されません。そのため、従来はbashrc
ではなくprofile
に設定されています。代わりに、script.sh
またはシステム全体から.bashrc
を調達します。
これは、/ etc/profile.d /が対話型ログインシェルでのみ使用されるためです。ただし、/etc/bash.bashrc
はインタラクティブな非ログインシェルによって使用されます。
通常はシステムにいくつかのグローバルエイリアスを設定するので、/etc/bashrc.d
の作成を開始しました。ここで、いくつかのグローバルエイリアスを含むファイルをドロップできます。
HAVE_BASHRC_D=`cat /etc/bash.bashrc | grep -F '/etc/bashrc.d' | wc -l`
if [ ! -d /etc/bashrc.d ]; then
mkdir -p /etc/bashrc.d
fi
if [ "$HAVE_BASHRC_D" == "0" ]; then
echo "Setting up bash aliases"
(cat <<-'EOF'
if [ -d /etc/bashrc.d ]; then
for i in /etc/bashrc.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
EOF
) >> /etc/bash.bashrc
fi
それらをサブシェルに継承したい場合は、代わりに関数を使用してください。それらは環境にエクスポートできます(export -f
)、そしてサブシェルはそれらの関数を定義します。
だから、あなたの例の1つについて:
rmvr() { rm -rv "$@"; }
export -f rmvr
それらがたくさんある場合は、最初にエクスポート用に設定します。
set -a # export the following funcs
rmvr() { rm -rv "$@"; }
cpvr() { cp -rv "$@"; }
mvrv() { mv -rv "$@"; }
set +a # stop exporting
同様の質問ですが、bashの「コマンドモード」を実行してエイリアスを利用できるようにしたかったのです。
bash -i 'alias'
は何もしません。しかし、インタラクティブセットアップを実行する -iフラグ を発見したので、これはbash -ci 'alias'
が機能します。
あなたの質問については、ファイルを「ソーシング」することでそれを回避できるようです。例:
bash -ci '. script.sh'
その後、エイリアスが機能します。 FWIW.。