Alias ​​dalam proses subkulit / anak


15

Saya mengatur alias di /etc/profile.d/alias.sh untuk setiap shell login. Tetapi jika saya menjalankan script.sh, saya tidak bisa menggunakan alias itu. Bagaimana saya bisa mengatur alias bahkan untuk subkulit atau proses anak?

/etc/profile.d/alias.sh

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

Jawaban:


23

Alias ​​tidak diwarisi. Itu sebabnya mereka diatur secara tradisional bashrcdan tidak profile. Sumber Anda script.shdari Anda .bashrcatau seluruh sistem sebagai gantinya.


Dengan diwariskan, maksud Anda misalnya variabel yang diekspor diwariskan dan sisanya tidak?
lisak

1
Saya tidak berpikir bahwa .bashrc membantu ... Jika Anda menggunakan alias itu dalam sebuah subkulit, ia tidak mengetahuinya
lisak

bashrc dibaca untuk semua shell non-login interaktif yang mengapa ini harus bekerja karena sebagian besar shell yang Anda jalankan adalah shell non-login interaktif, dan alias bekerja di subkulit dengan()
jw013

Saya tidak tahu tentang doa aliasName (), terima kasih
lisak

Untuk lebih jelasnya, apa yang saya maksud adalah di bash alias foo='echo foobar',, enter, (foo)output foobar.
jw013

10

Itu karena /etc/profile.d/ hanya digunakan oleh shell login interaktif. Namun, /etc/bash.bashrcdigunakan oleh shell non-login interaktif.

Seperti biasanya saya mengatur beberapa alias global untuk sistem, saya sudah mulai membuat di /etc/bashrc.dmana saya bisa meletakkan file dengan beberapa alias global:

    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

Jika Anda ingin mereka diwarisi ke sub-shell, gunakan fungsi saja. Mereka dapat diekspor ke environment ( export -f), dan sub-shells kemudian akan memiliki fungsi-fungsi tersebut didefinisikan.

Jadi, untuk salah satu contoh Anda:

rmvr() { rm -rv "$@"; }
export -f rmvr

Jika Anda memiliki banyak dari mereka, maka tetapkan untuk ekspor terlebih dahulu:

set -a # export the following funcs
rmvr() { rm -rv "$@"; }
cpvr() { cp -rv "$@"; }
mvrv() { mv -rv "$@"; }
set +a # stop exporting

0

Pertanyaan serupa, saya ingin menjalankan bash "mode perintah" dan menyediakan alias:

bash -i 'alias'tidak melakukan apa-apa. Tapi saya menemukan flag -i yang menjalankan setup interaktif, jadi ini: bash -ci 'alias'tidak berfungsi.

Untuk pertanyaan Anda, tampaknya Anda bisa mengelak dengan "mencari" file tersebut, mis:

 bash -ci '. script.sh'

Kemudian alias berfungsi. FWIW ...

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.