Lacak parameter tertentu pada beberapa perintah

10

Katakanlah saya punya perintah git branch(selalu dengan beberapa kata) misalnya.

Yang saya inginkan adalah melacak kapan perintah ini dijalankan dengan argumen. Misalnya, jika saya menjalankan perintah git branch developtanpa kesalahan, saya ingin menyimpan developpada file.

Saya mencoba untuk menimpa perintah git pada saya .bash_profile, sesuatu seperti ini:

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

Namun sepertinya itu tidak berfungsi dengan baik. Apakah ada cara untuk melakukan ini?

jherran
sumber
sesuai dengan contoh Anda (cabang git berkembang) Anda ingin memeriksa apakah "$ #" adalah "2" dan bukan "3"? ... (2 parameter ke fungsi git)
Olivier Dulac
Adalah kesalahan, tetapi kodenya hanyalah sebuah contoh
jherran
baik. Saya menambahkan komentar tambahan di bawah jawaban Stephane (baik). komentar saya mungkin tidak berlaku (saya menganggap .txt sebagai file log, tapi itu bisa menjadi sesuatu yang lain yang tidak dapat memiliki tanggal di dalamnya?)
Olivier Dulac

Jawaban:

18

Anda punya beberapa masalah di sini:

  • gitfungsi Anda menyebut dirinya secara rekursif bukan gitperintah asli .
  • Anda menggunakan tanda $@kutip yang tidak masuk akal sama sekali
  • Anda membiarkan variabel lain tidak dikutip , meminta shell untuk membagi + glob mereka.
  • Anda menggunakan echodata sewenang-wenang .
  • Anda kehilangan status keluar dari gitperintah asli .
  • Anda menimpa file log Anda pada setiap doa.
  • Anda memasukkan definisi fungsi ke dalam ~/.bash_profileyang dimaksudkan untuk menyesuaikan sesi login Anda, bukan shell Anda dan biasanya tidak dibaca oleh bashpermintaan non-login .

Anda menginginkan sesuatu seperti:

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

Itu adalah:

  • mengutip variabel Anda,
  • gunakan commanduntuk menjalankan git perintah ,
  • menyimpan status keluar gitdalam variabel lokal dan mengembalikannya saat keluar,
  • gunakan >>alih-alih >untuk pengalihan ke file log.
  • gunakan printfsebagai ganti echo.
  • dan masukkan itu ~/.bashrcsebagai gantinya (pastikan ~/.bash_profilesumber Anda adalah shell ~/.bashrclogin bashtidak membaca ~/.bashrcsecara default ( bashbug / misfeature)). Kecuali jika Anda ingin mengekspor gitfungsi itu (dengan export -f git) jika Anda juga ingin bashskrip yang memanggil gituntuk memanggil fungsi itu.
Stéphane Chazelas
sumber
1
Penjelasan luar biasa dan bekerja seperti pesona. Terima kasih banyak.
jherran
+1 untuk jawaban yang sangat bagus. Tetapi op mungkin perlu mengubah cek [ "$#" -eq 2 ], sesuai dengan contohnya. Dan itu bisa menjadi ide yang baik untuk menambahkan tanggal ke "tacked_parameters.txt". Dan saya akan memilih kasus umum (yaitu, tidak hanya melacak parameter ke-2 ketika 2 parameter, tetapi melacak parameter apa pun): Saya akan menyingkirkan if, dan memiliki printf '%s: %s\n' "$(date '+%Y-%m-%dT%H:%M:%S')" "$0 $*":? (yaitu, tunjukkan perintah + semua parameter (perhatikan bahwa Anda masih kehilangan beberapa info, misalnya parameter mana yang memiliki intra-separator, jika ada). Tanggal portabel dekat dengan standar iso8601)
Olivier Dulac