Alt kabuk / alt süreçte takma adlar


16

Her giriş kabuğu için /etc/profile.d/alias.sh dosyasında takma adlar ayarladım. Ama script.sh komutunu çalıştırırsam, bu takma adı kullanamam. Alt kabuklar veya alt süreçler için bile takma adı nasıl ayarlayabilirim?

/etc/profile.d/alias.sh

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

Yanıtlar:


24

Takma adlar devralınmaz. Bu yüzden geleneksel olarak yerleşirler bashrcve kurulmazlar profile. Kaynağınız script.shsenin dan .bashrcveya sistem genelinde bir yerine.


Devralınarak, örneğin dışa aktarılan değişkenlerin miras alındığı ve geri kalanı değil mi?
lisak

1
Ben .bashrc yardımcı olduğunu sanmıyorum ... Eğer o diğer ad sonra bir
subshell kullanırsanız

bashrc tüm etkileşimli giriş yapmayan kabuklar için okunur, bu yüzden başlatmanız gereken çoğu kabuk giriş yapmayan etkileşimli kabuklar olduğundan ve takma adlar alt kabuklarda çalışır()
jw013

İsim () çağırma hakkında bilmiyordum, teşekkür ederim
lisak

Sadece net olmak gerekirse, ne demek istediğim bash alias foo='echo foobar', girdi, (foo)çıktılardı foobar.
jw013

11

Bunun nedeni, /etc/profile.d/ dosyasının yalnızca etkileşimli oturum açma kabuğu tarafından kullanılmasıdır. Ancak, /etc/bash.bashrcetkileşimli oturum açma dışı kabuk tarafından kullanılır.

Genellikle sistem için bazı global takma adlar ayarladığım için, /etc/bashrc.dbazı global takma adlarla bir dosyayı bırakabileceğim bir yer oluşturmaya başladım :

    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

8

Alt kabuklara miras alınmasını istiyorsanız, bunun yerine işlevleri kullanın. Bunlar çevreye ( export -f) aktarılabilir ve alt kabuklar daha sonra bu işlevlere sahip olacaktır.

Yani, örneklerinizden biri için:

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

Bir demet varsa, önce dışa aktarma için ayarlayın:

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

0

Benzer soru, bash "komut modu" çalıştırmak ve takma adları mevcut istedim:

bash -i 'alias'hiç birşey yapmıyor. Ama etkileşimli kurulumları çalıştıran -i bayrağını keşfettim , bu yüzden: bash -ci 'alias'işe yarıyor.

Sorunuz için, dosyayı "kaynaklandırarak" atlatabilirsiniz, örneğin:

 bash -ci '. script.sh'

Sonra takma adlar çalışır. FWIW ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.