Я пытаюсь сохранить вывод приложения, которое я написал. Когда я пытаюсь сохранить вывод, перенаправив стандартный вывод, файл, в котором он получен, пуст.

Это то, что я печатаю в Terminal.app (OS X 10.9.2):

./AppName > test.txt

Приложение выводит текст через NSLog().

Я получаю вывод NSLog() в Terminal.app, но в результате файл text.txt пуст. Я прочитал, что мне может понадобиться запустить приложение, заменив ./ на путь к файлу:

appPath > text.txt

Происходит то же самое

Может кто-нибудь объяснить мне, в чем проблема?

3 ответа3

3

Вам нужно объединить STDERR с STDOUT . Сказать:

./AppName > test.txt 2>&1

и вы увидите результат в test.txt .

1

NSLog() регистрирует в системе Apple System Log (ASL), а не в stdout или stderr.

Зайдите в поток сообщений "Все сообщения" в Console.app или введите syslog в Терминале. Кроме того, вы можете настроить фильтры, чтобы ASL отправлял все сообщения журнала из вашего приложения в определенный текстовый файл. Смотрите man-страницы для ASL, syslog и т.д.

0

Сначала немного справочной информации:

По умолчанию обычная Unix-программа запускается с двумя файловыми дескрипторами: StdOut и StdErr.
StdOut осуществляется через дескриптор файла № 1.
StdErr выполняется через дескриптор файла № 2.

Перенаправление стандартного выхода осуществляется через 1> . Пример ./App 1> my_log.txt
Перенаправление стандартной ошибки осуществляется через 2> . Пример ./App 2> my_errors.txt

(> и 1> одинаковы. Одно это просто более короткое обозначение)

Это позволяет использовать полезные вещи, такие как только регистрация ошибок или запись нормального вывода в один файл, а ошибки - в другой файл. Или очень полезный случай записи нормального вывода в файл и получения ошибок на вашем экране.


Замена./ Имя приложения с полным путем к файлу не будет иметь никакого значения. Один запускает приложение из текущего каталога, второй указывает полный путь к приложению. Ни один из них не влияет на дескрипторы файлов.


Теперь мы наконец добрались до ответа на ваш вопрос:

Что вы хотите сделать, чтобы записать вывод из NSlog(). Для этого вы сначала узнаете, куда пишет nslog.

В соответствии с этим вопрос на нашем сестринском сайте StackOverflow NSLog выводит в ASL (версия syslog от Apple) и в консоль.

Таким образом, вы либо хотите прочитать вывод из системного журнала, либо изменить вывод из журнала на место, где вы можете легко его перехватить. Например, с freopen([path cStringUsingEncoding:NSASCIIStringEncoding], "a+", stderr);

Несколько методов о том, как это сделать, даны в посте [так], на который я ссылаюсь. Если вы добавите более подробную информацию в свой пост (например, разрешено ли изменение приложения?) тогда я могу ответить более подробно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .