Parametreleri diğer adlara nasıl geçirirsiniz?


64

Bash betiği için, "$@"bağımsız değişkenlere erişmek için kullanabilirim . Takma ad kullanırken eşdeğer nedir?

Yanıtlar:


50

Takma adlar, kendilerine verilen tüm argümanların, takma oldukları programa argüman olarak geçirildiği komutları gibidir. Örneğin, eğer takma edildi lsiçin ls -la, daha sonra yazmaya ls foo barediyorum gerçekten yürütmek ls -la foo barkomut satırında.

Argümanların nasıl yorumlandığı üzerinde gerçek bir kontrol sahibi olmak istiyorsanız, aşağıdaki gibi bir fonksiyon yazabilirsiniz:

my_program_wrapper() {
    local first_arg="$1" \
          second_arg="$2"

    shift 2               # get rid of the first two arguments

    # ...

    /path/to/my_program "$@"
}

3
opengroup.org/onlinepubs/009695399/utilities/… içindeki işlevler shtanımlanmıştır my_program_wrapper() { ...; }. Bash, anahtar kelimeyi ele alıyor, functionancak neden daha taşınabilir olanlarla devam etmiyor?
efemient

2
@ephemient Çok doğru. Demek istediğim, herkesin GNU Bash kullanması ve POSB kabuğundaki barebones kullanmaması.
amfetamachine

21

Diğer ad çözümü

Gerçekten bir işlevi kullanmaya karşıysanız, şunları kullanabilirsiniz:

$ alias wrap_args='f(){ echo before "$@" after;  unset -f f; }; f'
$ wrap_args x y z
before x y z after

Sen değiştirebilirsiniz $@ile $1sadece ilk argüman istiyorum.

açıklama

Bu fargümanlardan geçen geçici bir fonksiyon yaratır .

Diğer ad argümanları yalnızca sonunda iletilir. Diğer fadın sonunda denir.

Diğer unset -fad yürütülürken işlev tanımını kaldırır, böylece daha sonra askıda kalmaz.


Umm? wrap_args x y zverir: bash: beklenmedik belirteci yakınında sözdizimi hatası `('
Eliptik görünüm

@Elipticalview Hmm, kopyala yapıştır sorunu? Bash üzerinde çalıştığını doğruladı 4.4.12.
Tom Hale

1
fTakma ad verdim . Eşsiz kaldığımda fiyi çalışıyor. Eski isim çarpışma olayı.
Eliptik görünüm

command type f:)
Tom Hale

1
harika! bu en tembel değişken!
Sergius

19

Mevcut cevaplara ek olarak, takma adların nasıl çalıştığını anlamak için önemli bir şey bir takma komuttan sonra yazdığınız tüm parametrelerin kelimenin tam anlamıyla sonunda kullanılmasıdır. Bu nedenle, diğer komutları iki komut için kullanmanın hiçbir yolu yoktur (piped veya değil), bunlardan birincisi parametreleri yorumlamalıdır. Açıklığa kavuşturmak için, işte beklendiği gibi çalışmayacak bir şeye bir örnek:

alias lsswp="ls -l | grep swp"

( bu sorudan ilham alan bir örnek ) bu, her zaman geçerli dizinde ls -lgerçekleştirilen çıktısını kullanır ve bu konuda bir grep yapar.

lsswp / tmp /

eşdeğer ls -l | grep swp /tmp/ ve olmazdı ls -l /tmp/ | grep swp .

Argümanların ortada bir yerde kullanılması gereken tüm amaçlar için, functionbunun yerine birisinin kullanılması gerekir alias.


15

Aslında hiçbir şey yapmak zorunda değilsin; takma adlar bunu otomatik olarak yapar. Örneğin:

$ alias less="less -eirqM"
$ less foo.txt

Foo.txt'nin ilk sayfasını lessgöreceksiniz ve EOF (-e) 'de sonlandırılacak, aramalar büyük / küçük harf duyarlı olmayacaktır (-i), vb.


Lütfen soruma bakar mısın - benim için çözümlerin hiçbiri işe yaramaz ve ödül almaya izin verilmez.
JJD

1
@JJD Sorunuzu cevaplayan kişi doğrudur: bu durumda bir işlev istiyorsunuz, takma ad değil. Bu soruya verilen cevaplar aynı olduğu için, sorunuz doğru olarak kapatıldı.
Warren Young,

1

Csh için cevap veriyorum:

Evet, parametreleri takma adlarda kullanabilir ve - yukarıda söylenenden farklı olarak - takma ad tanımında herhangi bir yere başvurabilirsiniz - sadece sonunda değil.

Tar-gz -ing için bir örnek:

$ alias tgz "tar cvf - \!:1 | gzip -9 > \!:2.tar.gz"

, takma adınızı çağırırken sağlayacağınız parametreler nerede !:1ve !:2nerededir?

Kullanım örneği:

    $ ls
    clrcf.dat                             user_comment_2016.06.03_12:51:50.txt  user_comment_2016.06.03_12:54:48.txt
        TEST-wADM.tec                         user_comment_2016.06.03_12:52:04.txt  user_comment_2016.06.03_12:55:13.txt


    $ tgz user* out
    a user_comment_2016.06.03_12:51:50.txt 1K
a user_comment_2016.06.03_12:52:04.txt 1K
a user_comment_2016.06.03_12:54:48.txt 1K
a user_comment_2016.06.03_12:55:13.txt 1K

    $ ls out*
    out.tar.gz

Bu, tar komutunun isteğe bağlı yerlerine yerleştirdiğiniz iki parametreyi kullandığınız anlamına gelir; tgz

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.