Отслеживать определенные параметры по какой-либо команде

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
}

Но, похоже, это не работает хорошо. Есть какой-либо способ сделать это?

jherran
источник
в соответствии с вашим примером (git branch development) вы хотите проверить, является ли "$ #" "2", а не "3"? ... (2 параметра для функции git)
Оливье Дюлак
Была ошибка, но код всего лишь пример
jherran
ОК. Я добавил дополнительные замечания под хорошим ответом Стефана. мои замечания могут быть неприменимы (я думаю о .txt как о файле журнала, но это может быть что-то еще, что не может содержать даты?)
Оливье Дюлак

Ответы:

18

У вас есть несколько проблем здесь:

  • ваша gitфункция вызывает себя рекурсивно вместо исходной gitкоманды.
  • вы используете без $@кавычек, что не имеет никакого смысла вообще
  • Вы оставляете другие переменные без кавычек , прося, чтобы оболочка разделяла их.
  • вы используете 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
Удивительное объяснение и работает как шарм. Большое спасибо.
Джерран
+1 за очень хороший ответ. Но оператору, возможно, потребуется изменить чек [ "$#" -eq 2 ], в соответствии с его примером. И это может быть хорошей идеей, чтобы также добавить дату в «tacked_parameters.txt». И я бы пошел для общего случая (то есть, не просто отслеживать 2-ые параметры, когда 2 параметра, но отслеживать любые параметры): я бы избавился от if и имел printf '%s: %s\n' "$(date '+%Y-%m-%dT%H:%M:%S')" "$0 $*":? (т.е. покажите команду + все параметры (обратите внимание, что вы все еще теряете некоторую информацию, например, какой параметр имеет внутри-разделители, если есть). Переносимая дата, близкая к стандарту iso8601)
Оливье Дюлак