2015-12-21 26 views
13

Takma ad tanımlamanın en iyi yolu nedir?Kabukta "koşullu" takma adları tanımlamanın en iyi yolu

if (($+commands[ag])) ; then alias grep='ag'; fi 

veya

[[ -s $(which ag) ]] && alias grep='ag' 

veya

if $(which ag >& /dev/null); then alias grep='ag'; fi 

yoksa ...?

En iyisi, daha sağlam, daha performanslı ve/veya daha taşınabilir (Bash, Zsh).

Tavsiyeniz nedir?

cevap

9

Basit, açık POSIX varyantının, (çoğunlukla portatif olmayan) alternatiflerle karşılaştırıldığında nasıl bir sakıncaya sahip olacağını göremiyorum.

type ag >/dev/null 2>&1 && alias grep=ag 
+0

Güzel ve temiz. Temelde sorumu cevaplamak. – user3341592

+0

Yan soru: '' 'tür ag> &/dev/null''' veya sadece' '' tür ag>/dev/null''' (sizin yaptığınız gibi) kullanmak daha iyi? – user3341592

+1

Eski taşınabilir değildir. Stderr'i yeniden yönlendirmek isterseniz, stdout ve stderr için '2>/dev/null' veya'>/dev/null 2> & 1'. – tripleee

1

I (çıkış biçimi belirtilmemiş, yani söz konusu POSIX'deki olmadığı için ben which kullanmayın ve hiçbir şey yerine sessiz olma bulunduğunda, bu şikayet) Tüm Bourne miras kabukları için taşınabilirlik için bu pathto işlevini kullanın:

Eğer pathto çağrı sayısı ihmal edilebilir, çünkü performans gelince

test "`pathto less`" != "" && alias more=less 

birlikte bulunca verilen herhangi yürütülebilir için yol adı echos

pathto() { 
     DIRLIST=`echo $PATH|tr : ' '` 
     for e in "[email protected]"; do 
       for d in $DIRLIST; do 
         test -f "$d/$e" -a -x "$d/$e" && echo "$d/$e" 
       done 
     done 
} 

, umurunda olmamalıdır. İlk iki örneğiniz portatif olmayan (()) ve [[ ]] yapılarını kullanır ve bundan kaçınılmalıdır.

Ayrıca boş parçalarla özellikle PATH numaralı ürünlerde çalışmadığımı unutmayın. Güvenlik nedenlerinden kaçınılmalıdır, tıpkı . gibi.

+2

$ PATH 'içindeki girişler boşluk içeriyorsa, bu güvenilir değildir. Ama bunu diziden daha az (ve "<(...)" -siz) Bourne kabuklarında düzeltmek biraz iş gerektiriyordu (çıktıyı "echo" olarak tutmak, bunu normal bir boruyla kullanabileceğinizi ve "printf" inin çıktı '' \ 0 '' bunu yapabilirsin ... sanırım). Ayrıca bu *, bir şekilde, $ DIRLIST döngüsünde d için düşerken tamamen yok sayıldığından boş '$ PATH 'değerleriyle uğraşır. Bu, bir şekilde, kabuğun mevcut dizinde bir komut göreceği gerçeğini özleyeceği anlamına gelir. –

+1

Bu ayrıca, 'test' için kullanımdan kaldırılan '-a' argümanını kullanır ve komutun adı bir boşluk içeriyorsa ('$ PATH' ile-boşluk sorunu dikkate alınmazsa) birden fazla komutla kullanılamaz. (Ve evet, bu hiç gelmeyecek ama yine de bahsetmeye değer olduğunu düşündüm bir sorun olduğundan şüphe ediyorum.) –

+0

@EtanReisner Pedantry takdir, teşekkürler! :-) Mutlu Noeller. – Jens

İlgili konular