Поведение.DELETE_ON_ERROR с делает, и конвейерно обрабатывает

Я посмотрел на страницу справочника и не видел способа сделать это непосредственно через sed, поскольку я уверен, что Вы сделали перед выяснением. Я вижу несколько способов работать вокруг этого использования grep, но я думаю, что самое легкое является этим:

grep -rlZ "Ms. Johnson" . | xargs -0 sed -i'.bup' -e's/Ms. Johnson/Mrs. Melbin/g'

-r рекурсивно вызвать
-l распечатайте имя файла только
-Z закончите имена пустым указателем

3
15.07.2011, 13:44
2 ответа

При использовании удара можно также установить pipefail опцию глобально. У меня есть это однажды в начале моих make-файлов, и это фиксирует ошибки даже посреди канала:

# Make sure any errors in the middle of a pipe cause the build to fail
SHELL=/bin/bash -e -o pipefail

(Измененный от/bin/sh до/bin/bash на основе комментария MadScientist)

4
27.01.2020, 21:15
  • 1
    , MadScientist. Я обновлю свой ответ для отражения комментария. (И обсудите с моими товарищами по команде внутренне.) –  techno 23.07.2012, 19:50

Если Вы уверены, что Ваш make-файл будет иметь bash как его оболочка, Вы могли попытаться установить pipefail опцию:

SHELL=bash
.DELETE_ON_ERROR:
foo:
    set -o pipefail; false | true > foo

Так как каждая строка правила работает в отдельном экземпляре оболочки, необходимо будет добавить set -o pipefail к каждой строке Вы хотите применить это к.

Если Вы хотите, чтобы это работало над каким-либо POSIX sh (и не просто bash), ответ намного более включен.

2
27.01.2020, 21:15
  • 1
    Это работает, но мальчик - это ужасный для добавления его к каждой строке, которая содержит конвейер. –  Lorin Hochstein 18.07.2011, 21:05
  • 2
    @lorin: Вы могли очистить его немного со Сделать переменной - например. PF=set -o pipefail; после которого можно сделать $(PF) false | true > foo. номер –  Jander 19.07.2011, 04:41

Теги

Похожие вопросы