PATH'de yürütülebilir bir işlevi, varolan bir işlevle aynı ada sahip çalıştırma


16

Bazen bir yürütülebilir dosyayı gölgeleyen ve argümanlarını veya çıktısını değiştiren bir işlev tanımlarım. Böylece işlev yürütülebilir ile aynı ada sahiptir ve ben işlev özyinelemeli çağırmadan işlevinden çalıştırılabilir çalıştırmak için bir yol gerekir. Örneğin, otomatik olarak çıktısını çalıştırmak fossil diffyoluyla colordiffve less -Rben kullanın:

function fossil () {
    local EX=$(which fossil)
    if [ -z "$EX" ] ; then
        echo "Unable to find 'fossil' executable." >&2
        return 1
    fi
    if [ -t 1 ] && [ "$1" == "diff" ] ; then
        "$EX" "$@" | colordiff | less -R
        return
    fi
    "$EX" "$@"
}

Yürütülebilir dosyanın konumu hakkında emin olsaydım, sadece yazabilirim /usr/bin/fossil. Bash /bunun bir işlev değil, yürütülebilir bir komut olduğu anlamına gelir. Ama tam yerini bilmediğim için, arama whichve sonucu kontrol etmek için başvurmak zorundayım . Daha basit bir yol var mı?


1
“Bash /, komutun bir işlev değil yürütülebilir bir araç olduğu anlamına gelir. ” Diyorsunuz . Açıkçası, bu doğru değil. Korkunç (ve belgesiz) bir tasarım kararı olduğuna inandığım şeyde, bash işlev adlarının eğik çizgiler içermesine izin verir. Kesikler basitçe neden /usr/bin/fossilfarklı olmaya dize gelen fossilderken yüzden, /usr/bin/fossilbu çalıştırmayı deneyin değil fossilişlevi.
G-Man

Yanıtlar:


19

commandKabuk yerleşimini kullanın :

bash-4.2$ function date() { echo 'at the end of days...'; }

bash-4.2$ date
at the end of days...

bash-4.2$ command date
Mon Jan 21 16:24:33 EET 2013

bash-4.2$ help command
command: command [-pVv] command [arg ...]
    Execute a simple command or display information about commands.

    Runs COMMAND with ARGS suppressing  shell function lookup, or display
    information about the specified COMMANDs.  Can be used to invoke commands
    on disk when a function with the same name exists.

2
Bir başka seçenek de komuttan kaçmaktır \date.
jordanm

4
@jordanm, bu sadece takma adlar için geçerlidir. Soru fonksiyonlar hakkındaydı. pastebin.com/TgkHQwbb
manatwork

3

Komut dosyalarında, #!satır genellikle /bin/env bashyola dayalı bash komutunu çalıştırmak için kullanılır . (Bazı yardımcı programlar için farklılık gösterebilir). Burada da işe yarayacak ...

( commandAlternatif de çalışmalı, ancak belirli bir kabuğa bağlı olabilir) (Solaris'teki Bourne Kabuğu üzerinde çalışır, ancak aslında /bin/commandbu durumda Bash üzerine yerleşik bir kabuk olan çalışır )

Her ikisi de /bin/commandve /bin/envSUS'ta listelenir, bu nedenle tüm uyumlu uygulamalar buna sahip olmalıdır.


İşaret ettiğiniz için teşekkürler env. Hangi cevabı kabul etmem gerektiğinden şüpheliydim, ancak soru bash ile ilgili olduğundan, yerleşik commanden iyi çözümdür.
Petr Pudlák

1
Benim Linux'ta orada hayır commandyürütülebilir, fakat commandaynı zamanda çalışır dash, kshve zsh. Bu yüzden sadece içinde bir kabuk yerleşik olduğunu varsayıyorum bash. pastebin.com/fi3gyNse
manatwork

Solaris 10 Bourne üzerinde bir yapı değildir (Heirloom-sh olarak da mevcuttur). Bilinen bir yolu olan bir yürütülebilir dosyanın avantajları, bir işlev tarafından üzerine yazılamamasıdır.
Gert van den Berg

(/ Bin / komutunun olmaması /bin/env, kabuk yolunu kodlamak istemiyorlarsa komut dosyalarının neden karma-bang'dan sonra kullandığını açıklayabilir )
Gert van den Berg

3

Gert'ın yanıtı, birisinin de niceamaç için kullanabileceğini anlamamı sağladı (farkında olmadan senaryolarımdan birinde vardı):

$ function date() { echo 'at the end of days...'; }
$ date
at the end of days...
$ nice -n0 date
Mon Jan 21 16:45:21 CET 2013

Diğer cevaplardan daha az zariftir, ancak bazı durumlarda yararlı bir seçenek olabilir.


Sen benzer alternatifini dahil etmek için bu genişletmek isteyebilirsiniz: `which date`.
Eliah Kagan

1
@EliahKagan Sorun `which something`şu ki, somethingçalıştırılabilir bir şey yoksa talihsiz şeyler olabilir. Örneğin echo, eksikse `which echo` /bin/rm preciousFileamaçlanandan çok farklı bir şey yapar.
Petr Pudlák
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.