Как сохранить стандартную погрешность в переменной

Есть ли шанс, что вы работаете в Xcode 4.2 (или меньше), выполняя код, который был написан в Xcode 4.3? В 4.3+ Xcode вообще не требует, чтобы вы объявляли частные методы , он просто предполагает, что методы, записанные в файле реализации (без объявлений в интерфейсе), являются частными. Но в Xcode < = 4.2 это вызовет ошибку , и эти методы должны быть объявлены как минимум конфиденциально

162
задан Micha Wiedenmann 19 February 2019 в 07:38
поделиться

4 ответа

Было бы лучше записать файл с ошибкой следующим образом:

ERROR=$(</tmp/Error)

Оболочка распознает это и не должна запускать ' cat ' для получения данных.

Более сложный вопрос. Я не думаю, что есть простой способ сделать это. Вам нужно будет встроить весь конвейер в суб-оболочку, в конечном итоге отправив окончательный стандартный вывод в файл, чтобы вы могли перенаправить ошибки на стандартный вывод.

ERROR=$( { ./useless.sh | sed s/Output/Useless/ > outfile; } 2>&1 )

Обратите внимание, что требуется точка с запятой (в классическом оболочки - Bourne, Korn - обязательно; наверное, и в Баше). ' {} ' выполняет перенаправление ввода-вывода по вложенным командам. Как написано, он также будет фиксировать ошибки из sed .

ПРЕДУПРЕЖДЕНИЕ: Формально непроверенный код - используйте на свой страх и риск.

80
ответ дан 23 November 2019 в 21:22
поделиться

Это интересная проблема, для решения которой Я надеялся, что есть элегантное решение. К сожалению, в итоге я получил решение, подобное г-ну Леффлеру, но добавлю, что вы можете вызывать бесполезные функции изнутри Bash для улучшения читаемости:

#!/bin/bash

function useless {
    /tmp/useless.sh | sed 's/Output/Useless/'
}

ERROR=$(useless)
echo $ERROR

Все другие виды перенаправления вывода должны поддерживаться временным файлом.

2
ответ дан 23 November 2019 в 21:22
поделиться

Перенаправил stderr на stdout, stdout на / dev / null, а затем используйте обратные кавычки или $ () для захвата перенаправленного stderr:

ERROR=$(./useless.sh 2>&1 >/dev/null)
58
ответ дан 23 November 2019 в 21:22
поделиться

alsoUseless.sh

Это позволит вам передавать по конвейеру вывод вашего сценария useless.sh с помощью такой команды, как sed , и сохраните stderr в переменной с именем error . Результат канала отправляется на stdout для отображения или передачи в другую команду.

Он устанавливает пару дополнительных файловых дескрипторов для управления перенаправлениями, необходимыми для этого.

#!/bin/bash

exec 3>&1 4>&2 #set up extra file descriptors

error=$( { ./useless.sh | sed 's/Output/Useless/' 2>&4 1>&3; } 2>&1 )

echo "The message is \"${error}.\""

exec 3>&- 4>&- # release the extra file descriptors
]
63
ответ дан 23 November 2019 в 21:22
поделиться
Другие вопросы по тегам:

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