Відстежуйте певні параметри в якійсь команді


10

Скажімо, у мене є команда git branch(завжди з парою слів), наприклад.

Те, що я хочу, - це відслідковувати, коли ця команда виконується аргументами. Наприклад, якщо я виконую команду git branch developбез помилок, я хочу зберегти developу файлі.

Я спробував замінити команду git на моєму .bash_profile, приблизно так:

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

Але, здається, це не добре працює. Чи можна це зробити?


відповідно до вашого прикладу (розробка гілки git) ви хочете перевірити, чи "$ #" є "2", а не "3"? ... (2 параметри до функції git)
Олів'є Дулак

Була помилка, але код - лише приклад
jherran

добре. Я додав додаткові зауваження під відповідь Стефана (хороша) відповідь. мої зауваження можуть не застосовуватись (я думаю, що .txt є файлом журналу, але це може бути щось інше, у якому не можуть бути дати?)
Олів'є Дулак,

Відповіді:


18

Тут у вас є кілька проблем:

  • ваша gitфункція викликає себе рекурсивно замість оригінальної gitкоманди.
  • ви використовуєте $@котирування, що не має жодного сенсу
  • ви залишаєте інші змінні без котирування , просите оболонку розділити + glob.
  • ви використовуєте echoдля довільних даних .
  • ви втрачаєте статус виходу вихідної gitкоманди.
  • ви перезаписуєте свій файл журналу під час кожного виклику.
  • ви вводите визначення функцій у свою програму, ~/.bash_profileяка призначена для налаштування вашого сеансу входу, а не оболонки, і зазвичай не читається bashвикликами без входу .

Ви хочете чогось типу:

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

Це є:

  • цитуйте свої змінні,
  • використовувати commandдля запуску git команди ,
  • зберегти статус виходу gitу локальних змінних, повернути його при виході,
  • використовувати >>замість >для перенаправлення до файлу журналу.
  • використовувати printfзамість echo.
  • і помістіть це ~/.bashrcзамість цього (переконайтесь, що ваш ~/.bash_profileджерело пошуку, ~/.bashrcоскільки bashоболонки входу ~/.bashrcза замовчуванням не читаються ( bashпомилка / неправильне використання)). Якщо ви не хочете експортувати цю gitфункцію (з export -f git), якщо ви також хочете bashсценарії, які викликають, gitщоб викликати цю функцію.

1
Дивовижне пояснення і працює як шарм. Дуже дякую.
jherran

+1 за дуже гарну відповідь. Але, можливо, доведеться змінити чек [ "$#" -eq 2 ]на його приклад. І може бути хорошою ідеєю також додати дату до "tacked_parameters.txt". І я б пішов на загальний випадок (тобто, не просто відстежувати 2-й параметри, коли 2 параметри, але відстежувати будь-які параметри): Я б позбувся від if, і маю printf '%s: %s\n' "$(date '+%Y-%m-%dT%H:%M:%S')" "$0 $*":? (тобто покажіть команду + всі параметри (зауважте, що ви все ще втрачаєте деяку інформацію, наприклад, який параметр мав внутрішньо-роздільники, якщо такі є). Портативна дата, близька до стандарту iso8601)
Олів'є Дулак
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.