Невозможно получить вывод bash в файл - PullRequest
0 голосов
/ 07 ноября 2018

У меня работает демон Vowpal Wabbit, который я запустил с помощью следующей команды:

vw -i X_b123.model -t --quiet --daemon --port 26542 -r /dev/stdout

Затем я пытаюсь отправить что-то демону:

echo 'somedataforwovpal' | netcat localhost 26542 -q1

Я получаю ответ, вот так (обе строки - это ответ):

1:-0.0268077 2:-0.0990701 3:-0.154975
2

Пока все идеально и правильно. Что я хочу, это просто отправить этот вывод в файл. И это то, что сводит меня с ума. Зачем? Обычно я делаю это просто, отправив stdout в файл, подобный этому:

echo 'somedataforwovpal' | netcat localhost 26542 -q1 > myfile.txt

Ну, это работало только частично. Файл был создан, но он содержит только вторую строку вывода (только число 2 ) и первую строку 1: -0.0268077 2: -0.0990701 3: -0.154975 по-прежнему печать на консоль.

Итак, моя идея заключалась в том, что вторая часть собирается в stderr, поэтому я попробовал несколько следующих способов сохранить вывод stderr / stdout:

echo 'somedataforwovpal' | netcat localhost 26542 -q1 2> myfile.txt
echo 'somedataforwovpal' | netcat localhost 26542 -q1 2>&1 >  myfile.txt
echo 'somedataforwovpal' | netcat localhost 26542 -q1 &>  myfile.txt
echo 'somedataforwovpal' | netcat localhost 26542 -q1 > myfile.txt 2>&1
echo 'somedataforwovpal' | netcat localhost 26542 -q1 >> myfile.txt
script -c "echo '1 |w auto_t dum_qt |f auto_t dum_qt |m qm_pos_2' | netcat localhost 26542 -q1" myfile.txt

Не сработало, все так же. Ни один из этих методов, как вы можете видеть, я даже не пробовал сценарий, но все же. Это действительно сводит меня с ума, пожалуйста, есть кто-нибудь, кто мог бы спасти меня?

Ответы [ 3 ]

0 голосов
/ 08 ноября 2018

Почему добавление каждой новой строки не работает?

echo 'somedataforwovpal' | netcat localhost 26542 -q1 >> myfile.txt

со страницы руководства bash:

Добавление перенаправленного вывода

Перенаправление вывода таким способом приводит к открытию файла, имя которого является результатом раскрытия слова, для добавления в дескриптор файла n или стандартного вывода (дескриптор файла 1), если n не указано. Если файл не существует, он создается.

Общий формат добавления вывода:

[п] >> слово

Это дает какие-нибудь подсказки?

echo 'somedataforwovpal' | netcat localhost 26542 -q1 | cat -net
0 голосов
/ 10 мая 2019

Если вы хотите сохранить весь вывод (stdout + stderr + явный tty) в файл, вы можете использовать утилиту script:

$ script /tmp/session.log
Script started, file is /tmp/session.log

$ some_command args...
... output of some_command args ...

$ exit
Script done, file is /tmp/session.log

Теперь /tmp/session.log содержит все, что было зафиксировано на экране во время сеанса.

Страница man для script предупреждает:

script помещает все в файл журнала, включая переводы строк и возвраты. Это не то, чего ожидает наивный пользователь.

Вы можете использовать Perl-скрипт, подобный приведенному ниже, чтобы убрать окончательный вывод из нежелательного мусора (не очень научный, но работает для меня)

#!/usr/bin/perl -w
#
# Filter to clean script (and other terminal/interactive) junk output
#
while (<>) {
    # ANSI terminal sequences (empirical)
    s/\033\[\??(?:\d*(?:;\d*)*)?[hlmHJKL]//g;
    s/\033[=>]//g;

    # Backspace/delete sequences, slow/safe way from the inside out
    s/[^\010]\010//g;

    # Other CTRL & non-wanted ASCII chars
    tr/\000-\010\013-\037\177//d;

    print;
}
0 голосов
/ 07 ноября 2018

Можно обойти обычные перенаправления, но, как правило, не очень хорошая идея. Например:

#! /bin/env bash
echo $* >> $(tty)

работает, работает.

$: bypass foo >log 2>&1
foo

В журнале тоже ничего не идет.

$: ls -l log
-rw-r--r-- 1 P2759474 1049089 0 Nov  7 12:16 log

Извините, у меня нет хорошего решения для вас, но это может, по крайней мере, помочь вам обдумать, как это может происходить.

...