Não é possível salvar a saída de um executável unix

0

Eu estou tentando salvar a saída de um aplicativo que eu escrevi. Quando tento salvar a saída redirecionando o stdout, o arquivo resultante é em branco.

Isso é o que estou digitando no Terminal.app (OS X 10.9.2):

./AppName > test.txt

O aplicativo envia o texto por meio de um NSLog ().

Eu recebo a saída NSLog () no Terminal.app, mas o arquivo text.txt resultante está em branco. Eu li que posso precisar executar o aplicativo substituindo ./ pelo caminho do arquivo:

appPath > text.txt

A mesma coisa acontece.

Alguém poderia me explicar qual é o problema?

    
por Blakeasd 06.04.2014 / 03:41

3 respostas

3

Você precisaria mesclar STDERR a STDOUT . Diga:

./AppName > test.txt 2>&1

e você veria a saída em test.txt .

    
por 06.04.2014 / 05:43
1

O NSLog () registra no recurso Apple System Log (ASL), não stdout ou stderr.

Acesse o fluxo de logs "Todas as Mensagens" no Console.app ou digite syslog no Terminal. Além disso, você pode configurar filtros para obter o ASL para enviar todas as mensagens de log do seu aplicativo para um arquivo de texto específico. Veja as páginas de manual para ASL, syslog, etc.

    
por 06.04.2014 / 09:30
0

Primeiro, algumas informações básicas:

Por padrão, um programa normal do UNIX é iniciado com dois descritores de arquivo: StdOut e StdErr.
StdOut é feito através do descritor de arquivo número 1.
O StdErr é feito através do descritor de arquivo número 2.

Redirecionar saída padrão é feito via 1> . Exemplo ./App 1> my_log.txt
O redirecionamento do erro padrão é feito via 2> . Exemplo ./App 2> my_errors.txt

( > e 1> são iguais. Uma é apenas uma notação mais curta)

Isso permite coisas úteis, como apenas registrar erros, ou registrar a saída normal em um arquivo e os erros em um arquivo diferente. Ou o caso muito útil de registrar a saída normal em um arquivo e ainda obter erros exibidos na tela.


Substituir ./Appname pelo caminho completo do arquivo não fará diferença. Um inicia o aplicativo a partir do diretório atual, um especifica o caminho completo para o aplicativo. Nenhum influencia os descritores de arquivos.

Agora finalmente chegamos à resposta para sua pergunta:

O que você deseja fazer para registrar a saída de NSlog (). Para fazer isso, você primeiro descobre onde o nslog está gravando.

De acordo com essa é uma pergunta em nosso site StackOverflow NSLog do sistersite para o ASL (Versão da Apple do syslog) e para consolar.

Assim, você quer ler a saída do log do sistema ou alterar a saída do log para um local onde você possa facilmente interceptá-lo. Por exemplo. com freopen([path cStringUsingEncoding:NSASCIIStringEncoding], "a+", stderr);

Vários métodos sobre como fazer isso são respondidos no [so] post ao qual eu fiz o link. Se você adicionar mais detalhes à sua postagem (por exemplo, se estiver modificando o aplicativo permitido?), Posso responder com mais detalhes.

    
por 06.04.2014 / 14:19