Я делаю что-то подобное в своих make-файлах:
if (mycommand) &> mycommand.log; then
echo success
else
c=$?;
echo;echo -e "Bad result from previous command, see mycommand.log for more details";echo;
command_to_run_on_fail
(exit $c)
fi
Адаптируя это к вашей ситуации, вы можете сделать что-то вроде этого:
if ! (mycommand) &> mycommand.log; then
c=$?;
cat mycommand.log
rm mycommand.log
(exit $c)
fi
Итак, «if» запускает команду и направляет вывод в mycommand.log. Если вам нужно поймать stdout vs stdout vs что-то еще, вам может потребоваться изменить команду канала '&>' на '>'. Если команда не выполняется, запишите код ошибки, распечатайте содержимое mycommand.log, удалите mycommand.log и, наконец, вернитесь с исходным кодом ошибки.
Без (exit $ c) вы вернетесь с кодом выхода, который соответствует тому, что вернула команда 'rm'.
Наконец, если вам нужен однострочник, подойдет что-то вроде этого.
mycommand &> mycommand.log || cat mycommand.log; rm mycommand.log
Адаптация одной из автокоманд, приведенных в Vim Wikia, у меня, похоже, работает нормально с git commit -t /tmp/COMMIT_EDITMSG
:
" ~/.vim/ftplugin/gitcommit.vim
au! VimEnter COMMIT_EDITMSG exec 'norm gg' | startinsert!
Я использовал exec 'norm gg' |
вместо 1 |
, потому что :1 |
эквивалентно :1p |
и есть небольшая задержка при печати строки.