Как дождаться завершения программы и передать stdin на stdout, когда это будет сделано?

Прежде всего, обратите внимание, что вы запускаете wc -l в каталоге . Эта команда предназначена для подсчета строк в текстовых файлах. Таким образом, wc в основном смотрит на любой внутренний двоичный формат, который ваша файловая система использует для представления каталогов, и подсчитывает, сколько раз там появляется байт 0x0a, что, вероятно, не скажет вам ничего полезного.

Тем не менее, хотя оба каталога пусты, обратите внимание, что размер 04 / dat намного больше. Это означает, что в какой-то момент он содержал много файлов, которые с тех пор были удалены. Но удаление файлов не удаляет все следы из блоков каталога. В зависимости от файловой системы он может просто обнулить индексный дескриптор или объединить запись каталога с предыдущей записью фрагмента.

Таким образом, в одном каталоге в основном осталось намного больше crud, чем в другом, поэтому неудивительно, что больше crud содержит еще несколько символов новой строки (байт 0xa). И обратите внимание, что эти байты даже не обязательно должны быть частью имени файла, они могли быть частью числа.

2
25.01.2019, 13:56
4 ответа
#!/usr/bin/env bash
OUT="$*"
say "$OUT" | cat -

Если вы используете &&, его значение означает, что первая команда выполняется после второй команды, но результат первой команды не важен для второй команды. Я имею в виду, что у вас есть 2 разные команды, потому что вы используете &&. Если вы используете |, это означает, что первая команда что-то делает и дает что-то для второй команды. В конце вы должны указать атрибут для команды cat. Кстати, извините за мой английский

-3
27.01.2020, 23:10

Попробуйте:

say "stage 1" && cat /etc/passwd  |  { say "stage 2" && grep -v test ; }

На самом деле у меня нет sayв моей системе, но это работает:

espeak "stage 1" && cat /etc/passwd  |  { espeak "stage 2" && grep -v test ; }
0
27.01.2020, 23:10

Х!

Я бы предложил, основываясь на вашем собственном ответе, просто сбросить stdin на stdout, удалив часть, которая хранит его в переменной. Это должно уменьшить потребление памяти и заставить цепочку конвейеров работать так, как должны работать конвейеры (: одна строка обрабатывается, а результат отправляется следующему процессу ).

#!/usr/bin/env bash

MSG="$*"
say "$MSG"

cat -
0
27.01.2020, 23:10

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

Итак, мой say_and_passскрипт просто такой, который работает для моего варианта использования!

#!/usr/bin/env bash

OUT=$(cat -)

MSG="$*"
say "$MSG"

echo "$OUT"
0
27.01.2020, 23:10

Теги

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