Двойное использование xargs в одной строке для исправления подрывной деятельности «!» статус

Я нахожу лучшее решение своей проблемы здесь: Как исправить подрывную деятельность «!» статус

Но сейчас я просто хочу написать для этого небольшой сценарий.

Нравится:

svn status | grep '\!' | awk '{print $2}' | xargs svn revert

svn status | grep '\!' | awk '{print $2}' | xargs svn delete

Но в одну строчку.

Потому что после возврата к svn команда «svn status | grep '!'» Не вернет результатов. Рационально.

Думаю, я нашел решение: Помещение переданных данных to xargs дважды в одной строке, но я немного не знаю английского языка, и командная строка - это не мои сильные навыки.


person Axel Foucheriq    schedule 20.09.2012    source источник


Ответы (2)


svn status | grep '\!' | awk '{print $2}' | tee list.$$ | xargs svn revert
xargs svn delete < list.$$
rm list.$$

Команда tee подобна Т-образному трубному фитингу; одна копия вывода отправляется в каждый именованный файл, а другая - в стандартный вывод. Здесь я назвал только один файл. Это приводит к тому, что все откаты происходят до любого из удалений. Имя list.$$ - это простой способ защиты сценария от попадания в файлы других процессов; есть программы, подобные mktemp, которые можно использовать для создания более безопасных и менее предсказуемых имен. OTOH, если вы не работаете во враждебной среде, это вряд ли имеет значение. Если вы будете очень осторожны, вы создадите trap, чтобы файл был очищен:

tmp=${TMPDIR:-/tmp}/list.$$
trap "rm -f $tmp; exit 1" 0 1 2 3 13 15

svn status | grep '\!' | awk '{print $2}' | tee $tmp | xargs svn revert
xargs svn delete < $tmp

rm $tmp
trap 0

Есть и другие уловки, которые можно попробовать, но по крайней мере некоторые из них не гарантируют последовательную работу. Например, процесс подстановки в bash:

svn status | grep '\!' | awk '{print $2}' | tee >(xargs svn revert) | xargs svn delete

Каждый файл будет возвращен и удален, но последовательность действий непредсказуема.

person Jonathan Leffler    schedule 22.09.2012
comment
Прекрасно работают с ловушкой. Просто некоторые ошибки для возврата к каталогу, но удаление svn работает после. Большое Вам спасибо. - person Axel Foucheriq; 25.09.2012

Обе команды в одной строке. Обратите внимание на полную потерю xargs. Не то чтобы xargs не замечательный, просто он здесь не нужен.

x="$(svn status | grep '\!' | awk '{print $2}')"; svn revert "$x" && svn delete "$x" || echo "no svn delete $?"

Обратите внимание, что удаление svn не будет запущено, если svn revert завершится неудачно. «No svn delete» указывает на сбой одной из команд svn.

person Gilbert    schedule 22.09.2012