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


15

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

/etc/profile.d/alias.sh

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

回答:


23

エイリアスは継承されません。だからこそ、彼らは伝統的に設定されbashrcていないのprofileです。代わりに、システム全体またはシステム全体script.shからソースを取得してください.bashrc


継承とは、たとえばエクスポートされた変数が継承され、残りは継承されないことを意味しますか?
リサ

1
.bashrcが役立つとは思わない...そのエイリアスをサブシェルで使用すると、それを知らない
lisak

bashrcには、あなたが起動ほとんどのシェルは、対話型非ログインシェルであり、別名はとサブシェルで作業を行うので、これは動作するはず理由であるすべての対話非ログインシェルのために読まれる()
jw013

aliasName()呼び出しについて知りませんでした、ありがとう
-lisak

明確にするために、私が意味したのはbash alias foo='echo foobar'、enter、(foo)outputs foobarでした。
jw013

10

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

7

それらをサブシェルに継承したい場合は、代わりに関数を使用してください。これらは環境(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

0

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

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

あなたの質問については、ファイルを「ソース」することでそれを回避することができます。

 bash -ci '. script.sh'

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.