web-dev-qa-db-ja.com

サブシェル/子プロセスのエイリアス

ログインシェルごとに/etc/profile.d/alias.shにエイリアスを設定しました。しかし、script.shを実行すると、そのエイリアスを使用できなくなります。サブシェルまたは子プロセスに対してもエイリアスを設定するにはどうすればよいですか?

/etc/profile.d/alias.sh

alias rmvr='rm -rv';
alias cprv='cp -rv';
alias mvrv='mv -rv';
16
lisak

エイリアスは継承されません。そのため、従来はbashrcではなくprofileに設定されています。代わりに、script.shまたはシステム全体から.bashrcを調達します。

24
jw013

これは、/ 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
11
atus

それらをサブシェルに継承したい場合は、代わりに関数を使用してください。それらは環境にエクスポートできます(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
8
Droj

同様の質問ですが、bashの「コマンドモード」を実行してエイリアスを利用できるようにしたかったのです。

bash -i 'alias'は何もしません。しかし、インタラクティブセットアップを実行する -iフラグ を発見したので、これはbash -ci 'alias'が機能します。

あなたの質問については、ファイルを「ソーシング」することでそれを回避できるようです。例:

 bash -ci '. script.sh'

その後、エイリアスが機能します。 FWIW.。

0
rogerdpack