Bir kabuk komut dosyasında takma ad nasıl çalıştırılır?

75

Tam yolu mpiexec olan bir yürütülebilir dosya ~/petsc-3.2-p6/petsc-arch/bin/mpiexec var. Bu komutu farklı dizinlerde (tüm yolu yeniden yazmadan) çalıştırmak istediğim için, .bashrc dosyasında bir takma ad oluşturuyorum:

alias petsc="~/petsc-3.2-p6/petsc-arch/bin/mpiexec"  

, bu mpiexec dosyasını komut isteminde kolayca yazarak bana izin verir:

petsc myexecutable

Yeni kod adıma script komutunu kullanarak petsc adlı bir kabuk komut dosyası yazmayı denedim. Kabuk betiğimi uygun izinler verdikten sonra ( chmod kullanarak), komut dosyasını çalıştırmayı denedim. Ancak, bana şu hatayı verdi:

./script: line 1: petsc: command not found

Sadece mpiexec dosyasının tam yolunu yazabileceğimi biliyorum, ancak yeni bir komut dosyası yazmak istediğim her zaman tam yol yazmak zahmetli. Benim takma ad% sc_de% betik dosyasında kullanabileceğim bir yolu var mı? Bunun gerçekleşmesi için petsc veya .bashrc değerini düzenleyebileceğim bir yöntem var mı?

    
sordu Paul 26.01.2012 19:11

9 cevap

57
  1. Kabuk betiğinizde bir takma ad yerine tam yolu kullanın.

  2. Kabuk betiğinizde bir değişken ve farklı bir sözdizimi ayarlayın

    petsc='/home/your_user/petsc-3.2-p6/petsc-arch/bin/mpiexec'
    
    $petsc myexecutable
    
  3. Komut dosyanızdaki bir işlevi kullanın. Muhtemelen petsc karmaşık ise daha iyi

    function petsc () {
        command 1
        command 2
    }
    
    petsc myexecutable
    
  4. Takma adlarınızı yazın

    shopt -s expand_aliases
    source /home/your_user/.bashrc
    

Muhtemelen .bashrc kaynağınızı kullanmak istemiyorsunuz, bu yüzden IMO, ilk 3'ten biri daha iyi olurdu.

    
verilen cevap Panther 26.01.2012 19:19
48

Takma adlar kabuk işlevleri lehine kaldırılmıştır. % Co_de% el sayfasından:

For almost every purpose, aliases are superseded by shell functions.

Bir işlev oluşturmak ve onu alt kabuklara dışa aktarmak için aşağıdakileri% co_de dosyanıza yerleştirin:

petsc() {
    ~/petsc-3.2-p6/petsc-arch/bin/mpiexec "[email protected]"
}
export -f petsc

Ardından komutunuzu komut dosyalarınızdan serbestçe arayabilirsiniz.

    
verilen cevap enzotib 26.01.2012 19:28
10

Kabuk işlevleri ve takma adlar kabukla sınırlıdır ve yürütülen kabuk betiklerinde çalışmaz. Davanız için alternatifler:

  • ( mpiexec yerine petsc kullanmakta sıkmıyorsanız) $HOME/petsc-3.2-p6/petsc-arch/bin 'yı PATH değişkenine ekleyin. Bunu ~/.profile düzenleyerek ve ekleyerek yapabilirsiniz:

    PATH="$HOME/petsc-3.2-p6/petsc-arch/bin:$PATH"
    

    Bu değişiklikleri uygulamak için yeniden giriş yapın

  • ~/bin dizinini ve

    oluştur
    • petsc adlı bir sarmalayıcı komut dosyası hazırlayın:

      #!/bin/sh
      exec ~/petsc-3.2-p6/petsc-arch/bin/mpiexec "[email protected]"
      
    • Program buna izin veriyorsa, shellscript'i atlayabilir ve komutu kullanarak bir sembolik link yapabilirsiniz:

      ln -s ~/petsc-3.2-p6/petsc-arch/bin/mpiexec ~/bin/petsc
      
verilen cevap Lekensteyn 26.01.2012 19:52
4

Bash 4'te özel değişkeni kullanabilirsiniz: $BASH_ALIASES .

Örneğin:

$ alias foo="echo test"
$ echo ${BASH_ALIASES[foo]}
echo test
$ echo '${BASH_ALIASES[foo]}' bar
test bar

Alternatif olarak değişken olarak tanımlayın, ardından komut ikamesi kullanın veya eval .

Örneğin, aşağıdaki gibi takma adları tanımlamak yerine:

alias foo="echo test"

şöyle tanımlayın:

foo="echo test"

Bunun yerine. Sonra da şunu uygulayınız:

find . -type f -exec sh -c "eval $foo" \;

veya

find . -type f -exec sh -c "echo '$foo'" \;
    
verilen cevap kenorb 02.06.2015 00:31
2

Aşağıdaki kodu .bash_aliases koyabilirsiniz:

petsc() {
~/petsc-3.2-p6/petsc-arch/bin/mpiexec "[email protected]"
}

Ardından, dosyayı source .bash_aliases . O zaman ara: petsc arg .

Avantaj: export -f petsc 'de bash_aliases değerine ihtiyacınız yok. Asallar kullanımdan kaldırıldı ancak sanırım .bash_aliases değerini kullanmıyorsunuz.

    
verilen cevap Timo 28.03.2015 10:07
2

Betikinizi -i bayrağıyla etkileşimli bir kabuk olarak yürütmek için bash'ı zorlayabilirsiniz. Bu, diğer adlar ve diğer işlevleri tanımlamak için .bashrc dosyanıza bildirir.

Örnek:

~ $ grep ll .bashrc
alias ll='ls -lah'
~ $ cat script.sh 
#!/bin/sh

ll
~ $ bash script.sh 
script.sh: line 3: ll: command not found
~ $ bash -i script.sh
..directory contents..

Daha fazla bilgi:

$ man bash
    
verilen cevap Amado Martinez 10.01.2017 09:03
1
  1. Takma komut dosyanızdaki takma adlarınızı kullanın.
  2. Komut dosyanızı, geçerli, etkileşimli kabuğunuzda yürütmek yerine kaynak kodlayın.

Yani, takma adları içeren komutlarınızla script.sh adlı bir dosyanız varsa, şunu yazın:

source script.sh
    
verilen cevap Gordon Erlebacher 25.07.2016 02:00
0

(EDIT: mpiexec'i yanlış aradığımdan beri işlevler kaldırıldı.)

İhtiyacınız olan tek şey daha az yazmanızsa, neden klasörü $ PATH'a yerleştirmiyorsunuz? Ya da $ PATH'daki bir klasörden mpiexec'e bir sembolik bağlantı mı kuruyorsunuz? Veya (en sevdiğim), takma adı, komut dizesinde yazdığınız bir betiğe mi ekledi?

    
verilen cevap unhammer 26.01.2012 20:22
0
ALIASES
   ...
   Aliases are not expanded when the shell is not interactive, unless the expand_aliases shell option is set using shopt (see the description of shopt under SHELL BUILTIN COMMANDS
   below).

Öyleyse, bu soruna gerçek bir cevap, kabuk takma adlarında gerçek takma adların alternatifler yerine kullanılması isteyenler için:

#!/bin/bash

shopt -s expand_aliases

alias foo=bar

foo whatever

Neden için şunu yapmak istiyorum: Olağandışı durumlar nedeniyle, Dockerfile'ı bir kabuk komut dosyası olarak düşünmem gerekiyor.

    
verilen cevap Throwaway Account 3 Million 18.07.2018 02:50

Etiketlerdeki diğer soruları oku