Bazı komutlarda belirli parametreleri izleme


10

Diyelim ki bir komutum var git branch(her zaman birkaç kelimeyle).

Ne istiyorum bu komut argümanlarla yürütüldüğünde takip etmektir. Örneğin, komutu git branch develophatasız yürütürsem, developbir dosyaya kaydetmek istiyorum .

Git komutumun üzerine yazmaya çalıştım .bash_profile, şöyle bir şey:

git () {
    if [ $# -eq 3 ]
    then
        git $@
        echo $2 > /path/tacked_parameters.txt
    else
        git $@
    fi
}

Ama bu iyi çalışmıyor gibi görünüyor. Bunu yapmanın bir yolu var mı?


örneğinize göre (git şubesi gelişir) "$ #" ın "3" değil "2" olup olmadığını kontrol etmek mi istiyorsunuz? ... (git fonksiyonuna 2 parametre)
Olivier Dulac

Bir hataydı, ancak kod sadece bir örnektir
jherran

tamam. Stephane'nin (iyi) cevabının altına ek açıklamalar ekledim. Açıklamalarım geçerli olmayabilir (.txt dosyasını bir günlük dosyası olarak düşünüyorum, ancak içinde tarihler bulunamayan başka bir şey olabilir mi?)
Olivier Dulac

Yanıtlar:


18

Burada birkaç probleminiz var:

  • sizin gitişlevi yerine orijinal yinelemeli kendisini aradığını gitkomuta.
  • $@herhangi bir anlam ifade etmeyen alıntı kullanılmamış
  • diğer değişkenleri tırnaksız bırakıp kabuğun onları bölmesini + yutmasını istersiniz .
  • Eğer konum kullanarak echokeyfi veriler için .
  • orijinal gitkomutun çıkış durumunu kaybediyorsunuz .
  • her çağrı üzerine günlük dosyanızın üzerine yazıyorsunuz.
  • işlev tanımlarınızı ~/.bash_profile, kabuğunuza değil, oturum açma oturumunuzu özelleştirmek amaçlıdır ve normalde oturum açma dışı bashçağrılar tarafından okunmaz .

Şuna benzer bir şey istersiniz:

git() {
  if [ "$#" -eq 3 ]
  then
    local ret
    command git "$@"; ret=$?
    printf '%s\n' "$2" >> /path/tacked_parameters.txt
    return "$ret"
  else
    command git "$@"
  fi
}

Yani:

  • değişkenlerinizi belirtin,
  • kullanmak commandçalıştırmak için git komut ,
  • çıkış gitdeğişkenlerini yerel değişkenlere kaydedip çıkışta döndürme,
  • günlük dosyasına yönlendirme >>yerine kullanın >.
  • printfyerine kullanın echo.
  • ve senin o koymak ~/.bashrcyerine (emin senin ~/.bash_profilekaynak olduğu ~/.bashrcgiriş olarak bashkabukları okumaz ~/.bashrcvarsayılan (bir yan bashhata / misfeature)). Bu gitişlevi çağırmak için çağıran komut dosyaları export -f gitda istemeniz durumunda bu işlevi (ile ) dışa aktarmak istemiyorsanız .bashgit

1
İnanılmaz bir açıklama ve bir cazibe gibi çalışır. Çok teşekkür ederim.
jherran

Çok iyi bir cevap için +1. Ancak, [ "$#" -eq 2 ]örneğine göre op'nun kontrolü değiştirmesi gerekebilir . Ve tarihi "tacked_parameters.txt" dosyasına eklemek de iyi bir fikir olabilir. Ve ben genel durum için gitmek istiyorum (yani, sadece 2 parametreleri 2 parametreler izlemek, ama herhangi bir parametre izlemek): if kurtulmak, ve var printf '%s: %s\n' "$(date '+%Y-%m-%dT%H:%M:%S')" "$0 $*":? (yani, komutu + tüm parametreleri göster (eğer varsa, hangi parametrelerin intra-separatörleri varsa hala bazı bilgileri kaybettiğinizi unutmayın.) iso8601 standardına yakın taşınabilir tarih )
Olivier Dulac
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.