tee посылает неполные данные

Или оставьте поле ввода пароля пустым. Если вы используете wpa_gui, вам будет предложено ввести пароль. (Я делаю это с учетными записями eduroam, так как мой пароль такой же, как и мой логин * nix)

2
08.10.2018, 13:28
3 ответа

Кажется --output-error=warnделает это.

head -c10G /dev/zero |
  tee --output-error=warn >(head -c10M | wc -c) >(head -c100M | wc -c) >(head -c1000M | wc -c)

К сожалению, он также спамит предупреждениями на stderr и не завершает работу, если не может писать ни в один из них.

0
27.01.2020, 21:58

Вы должны использовать tee --output-error=exit-nopipe. Это проигнорирует сигнал SIGPIPEи ошибку записи EPIPE, но все равно умрет при любых других ошибках.

tee --output-error=exit-nopipe, как и вариант warnиз вашего ответа, завершается, когда он не может записать хотя бы один из своих выходов; но он считает стандартный вывод одним из них.

В ваших примерах есть ошибки, потому что они просто сбрасывают вывод head -c10G /dev/zero | tee...на ваш терминал (, который вы не видите, потому что нулевой байт "невидим" ); и именно поэтому teeв вашем ответе не выходит из :, потому что он все еще будет записываться в стандартный вывод после выхода из процесса замены >(...).

Для систем без GNU tee возможным обходным решением является добавление cat >/dev/nullк командам, которым передается вывод tee; но вы не можете сделать это со всеми ими; вам придется выбрать «главный» вывод, который приведет к выходу tee, если запись на него не удастся. Пример:

$ dd if=/dev/zero |
  tee >(dd of=/dev/null count=200; cat >/dev/null) >(dd of=/dev/null count=700; cat >/dev/null) |
  dd of=/dev/null count=1000
$ dd if=/dev/zero |
  tee >(dd of=/dev/null count=1000) >(dd of=/dev/null count=700; cat >/dev/null) |
  { dd of=/dev/null count=200; cat >/dev/null; }

Оба должны записывать 200, 700 и 1000 блоков соответственно.

5
27.01.2020, 21:58

Бывает, что любой канал, который блокирует, отправит SIGPIPE на teeи остановит его:

$ head -c10G /dev/zero |   tee >(head -c10 | wc -c) >(head -c1M | wc -c)
10
65536

Команда teeполучает SIGPIPE из первого канала и вызывает выход всех дочерних элементов.

Вам нужно будет расширить каждую трубу, чтобы не было ограничений:

$ head -c10G /dev/zero |   tee >({ head -c10 | wc -c; }; cat >/dev/null )  >(head -c1M | wc -c)
10
1048576

для всех приведенных вами случаев:

$ head -c10G /dev/zero |   tee >({ head -c1M | wc -c;}; cat >/dev/null) >({ head -c10M | wc -c; }; cat >/dev/null) >( { head -c100M | wc -c; }; cat>/dev/null) >(head -c1000M | wc -c)
1048576
10485760
104857600
1048576000

Но проще сообщить tee, чтобы избежать выхода из-за ошибок конвейера с опцией -p:

$ head -c10M /dev/zero |   tee -p >(head -c10 | wc -c) >(head -c100 | wc -c) >(head -c1000| wc -c) >(head -c1M | wc -c)
100
1000
10
1048576

Что может печатать не по порядку.

0
27.01.2020, 21:58

Теги

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