Komut satırı bağımsız değişkenlerini kabuk takma adına nasıl iletirim?


288

Komut satırı bağımsız değişkenlerini bir takma ada nasıl iletirim? İşte bir örnek:

takma ad mkcd = 'mkdir $ 1; cd $ 1; '

Ancak bu durumda, $ xx çalışma zamanında değil, diğer adın oluşturulma saatinde çevrilir. Ancak, aşağıdaki gibi (biraz googling sonra) kabuk işlevi kullanarak bir geçici çözüm oluşturduk:

işlev mkcd () {
  mkdir $ 1
  cd $ 1
}

Sadece CL parametrelerini kabul eden takma adlar yapmanın bir yolu olup olmadığını bilmek istedim.
BTW - Varsayılan kabuğum olarak 'bash' kullanıyorum.



2
O / T ama mkcd işlevi yapmaya alternatif olarak, yazabilirsinizmkdir mydirectoryname && cd $_
moala

Yanıtlar:


174

Yolu buldunuz: takma ad yerine bir işlev oluşturma. C kabuğunun takma adlara argüman yapmak için bir mekanizması vardır, ancak bash ve Korn kabuğu yoktur, çünkü fonksiyon mekanizması daha esnektir ve aynı kabiliyeti sunar.


Ancak .bashrcdosyada takma adlar oluştururken işlevlere ihtiyacınız yoktur . Örneğin # # kullanıcı adı tarafından port numarasını alan bir diğer ad sunun serve = "python -m SimpleHTTPServer $ 1" .bashrc dosyasında değişiklik yaptıktan sonra aşağıdaki komutu girdiğinizden emin olun. ~ $ source .bashrc Bunu şu şekilde kullanabilmelisiniz ~ $ serve 8998
kaizer1v

8
@ kaizer1v, CentOS7.3 bash sürüm 4.2.46'daki gözlemim, önerinizin düşündüğünüz gibi çalışmamasıdır. Çift tırnak kullandığınız için $ 1 aslında boş bir dize olarak değerlendiriliyor ve takma ad aslında takma ad serve = "python -m SimpleHTTPServer" ile aynıdır ve böylece bu takma addan sonra ne geçerseniz ALSO komut satırından geçirilir. Bu seti denerseniz -x; takma ad hizmet = "python -m SimpleHTTPServer $ 1 &" hata / sorun göreceksiniz. Hem argümanınız hem de takma ad komutu ayrı komutlar olarak çalıştırılır.
PatS

279

Sadece Bash'de diğer mermiler için gönderilenleri tekrarlamak için :

alias blah='function _blah(){ echo "First: $1"; echo "Second: $2"; };_blah'

Aşağıdakileri çalıştırma:

blah one two

Aşağıdaki çıktıyı verir:

First: one
Second: two

4
Harika bir çözüm. Bir bash acemisinden bazı sorular: İşlev bir alt çizgi ile (veya farklı bir şekilde) adlandırılmalı mı yoksa sadece okunabilirlik için mi? Fonksiyonun tanımlanmasındaki "; _blah" ifadesinin amacı nedir? $ 1 civarında tırnak gerektirmeyen bir şey yaparken bile tek tırnak yerine çift tırnak kullanılırken ($ 1 doğru yorumlanmaz) neden çalışmıyor? Tavsiye için şimdiden teşekkürler. Çalışan bir çözümüm var ama neden işe yaradığını daha iyi anlamak istiyorum.
mynameispaulie

4
@mynameispaulie Bu işleve herhangi bir ad verilebilir. İsim çarpışmalarını önlemeye yardımcı olmak için ortak bir hile olarak alt çizgi öneki kullandım (yani aynı ada sahip başka bir işlev)
Thomas Bratt

6
çift tırnak izin @mynameispaulie Bashyerine $1ve $2işlevine geçirilen parametreleri ile. Tek tırnak işaretleri Bash'e bunu yapmamasını söyler.
Thomas Bratt

5
Bu takma ad / işlev açılan kopyasını / yapıştırmasını çok görüyorum, ancak yararlı bir amaca hizmet etmiyor gibi görünüyor. Standart yaklaşım, işlevi aklı başında bir adla bir kez tanımlamak ve takma adı olmamaktır.
üçlü

16
Bunun nasıl tercih edildiğini göremiyorumfunction blah(){ echo "First: $1"; echo "Second: $2"; }
René Nyffenegger

57

Ksh ile yapamazsınız, ama csh ile yapabilirsiniz.

alias mkcd 'mkdir \!^; cd \!^1'

Ksh olarak, işlev gitmek için bir yoldur. Ancak gerçekten takma ad kullanmak istiyorsanız:

alias mkcd='_(){ mkdir $1; cd $1; }; _'

İlginç bir yan not olarak, son zamanlarda herkesin bahsettiği uzaktan kod yürütme güvenlik açığının neredeyse aynı şeyi yapmayı gerektirdiğini, ancak ham kullanıcı girdisi tarafından ayarlanan bir ortam değişkeninde olduğunu düşünüyorum. openwall.com/lists/oss-security/2014/09/24/11
Floegipoky

@Floegipoky - Çünkü bir env var değil, bir takma adda, önemli ölçüde farklı. ShellShock sorunları, env var ayarlandığında çalıştırılmasıdır. Bir env var ayarının güvenli bir işlem olması gerekir. Yukarıdaki takma ad ayarlandığında, yalnızca takma ad çalıştırıldığında komut dosyası çalıştırılmaz.
Sanjaya R

Belki de cshmodern bir insanın kullanmak istediği şey olmadığına dikkat çekilmelidir. Bu işlevi dolaylı olarak çalıştıran bir işlev yaratan takma ad nispeten popülerdir, ancak anlayabildiğim kadarıyla düzgün bir işlevden fayda sağlamaz. (İşlev zaten argümanını düzgün bir şekilde alıntılamalıdır.)
üçlü

17

Bash man sayfasını alıntılamak için:

Değiştirilen metinde bağımsız değişkenler kullanmak için bir mekanizma yoktur. Bağımsız değişkenler gerekiyorsa, bir kabuk işlevi kullanılmalıdır (aşağıdaki FONKSİYONLAR'a bakın).

Görünüşe göre kendi sorunuzu cevapladınız - takma ad yerine bir işlev kullanın



5

İşlevlerin ~/.cshrcdosyaya yazılamayacağını buldum . Burada argümanlar alan takma adda

örneğin, 'find' komutuna iletilen argümanlar

alias fl "find . -name '\!:1'"     
Ex: >fl abc

burada abc, şu şekilde geçirilen argüman!


4
Bu varsayılan kabuğu bash olan OP için yararlı değildir. Ve Sanjaya R'nin cevabı 4 yıl önce csh takma adlarından bahsetti.
Keith Thompson

1
Sanjaya R'nin cevabı ne anlama !:1geldiğini açıklamadı . Tartışma olduğunu görmek için aşağı kaydırmak zorunda kaldım. İyi bir cevap, OPs kabuk türü için olmasa bile, daha fazla soru bırakmaz.
searchengine27

4

En kolay yol, diğer ismi değil fonksiyonu kullanmaktır. istediğiniz zaman klipten bir işlevi çağırabilirsiniz. Bash içinde, sadece diğer adla aynı şekilde yüklenen fonksiyon adını () {command} ekleyebilirsiniz.

function mkcd() { mkdir $1; cd $1 ;}

Diğer mermilerden emin değilim



1

Bu ksh olarak çalışır:

$ alias -x mkcd="mkdir \$dirname; cd \$dirname;"
$ alias mkcd
mkcd='mkdir $dirname; cd $dirname;'
$ dirname=aaa 
$ pwd
/tmp   
$ mkcd
$ pwd
/tmp/aaa

"-X" seçeneği diğer adı "dışa aktarır" - diğer adı alt kabuklarda görünür hale getirir.

Ve bir komut dosyasında tanımlanan takma adların bu komut dosyasında görünmediğini unutmayın (çünkü bir kod yüklendiğinde takma adlar genişletilir, çünkü bir satır yorumlandığında değil). Bu, aynı kabukta başka bir komut dosyası (nokta kullanarak) çalıştırılarak çözülebilir.



-2

İşte python kullanarak basit bir örnek fonksiyon. İçeri sok ~ / .bashrc
Önce sol kıvırcık parantez sonra boşluk olması gerek
değişken değişimi almak için piton komut ihtiyaçları çift tırnak olmak
sonunda bu noktalı virgül unutma Do

işlev sayısı () {python -c "num in xrange ($ 1): print num";}

$ count 6
0
1
2
3
4
5
$

-5

Boş bir takma ad, bağımsız değişkenlerini yürütür:

alias DEBUG=

12
Temsilciniz tarafından SO (Stack Overflow) konusunda yeni olduğunuzu görüyorum. Lütfen cevabınızın oylanması sizi korkutmasın. OP (Orijinal Poster) 'in cevaplamasını istediği soruya gerçekten cevap vermediği için oylandı. Asın ve denemeye devam edin. Ayrıca yanıtlarken, yanıtınızın nasıl çalıştığına ve çıktıyı göstermeye yönelik basit bir örnek eklemeye çalışın. Bu, başkalarının cevabınızın nasıl çalıştığını görmesine yardımcı olacaktır.
PatS
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.