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';
lisak
sumber

Jawaban:

23

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

jw013
sumber
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
kepada kami
sumber
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
Droj
sumber
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 ...

rogerdpack
sumber