Прежде всего, обратите внимание, что вы запускаете wc -l
в каталоге . Эта команда предназначена для подсчета строк в текстовых файлах. Таким образом, wc в основном смотрит на любой внутренний двоичный формат, который ваша файловая система использует для представления каталогов, и подсчитывает, сколько раз там появляется байт 0x0a, что, вероятно, не скажет вам ничего полезного.
Тем не менее, хотя оба каталога пусты, обратите внимание, что размер 04 / dat
намного больше. Это означает, что в какой-то момент он содержал много файлов, которые с тех пор были удалены. Но удаление файлов не удаляет все следы из блоков каталога. В зависимости от файловой системы он может просто обнулить индексный дескриптор или объединить запись каталога с предыдущей записью фрагмента.
Таким образом, в одном каталоге в основном осталось намного больше crud, чем в другом, поэтому неудивительно, что больше crud содержит еще несколько символов новой строки (байт 0xa). И обратите внимание, что эти байты даже не обязательно должны быть частью имени файла, они могли быть частью числа.
#!/usr/bin/env bash
OUT="$*"
say "$OUT" | cat -
Если вы используете &&, его значение означает, что первая команда выполняется после второй команды, но результат первой команды не важен для второй команды. Я имею в виду, что у вас есть 2 разные команды, потому что вы используете &&. Если вы используете |, это означает, что первая команда что-то делает и дает что-то для второй команды. В конце вы должны указать атрибут для команды cat. Кстати, извините за мой английский
Попробуйте:
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 ; }
Х!
Я бы предложил, основываясь на вашем собственном ответе, просто сбросить stdin на stdout, удалив часть, которая хранит его в переменной. Это должно уменьшить потребление памяти и заставить цепочку конвейеров работать так, как должны работать конвейеры (: одна строка обрабатывается, а результат отправляется следующему процессу ).
#!/usr/bin/env bash
MSG="$*"
say "$MSG"
cat -
Оказывается, все, что мне нужно было сделать, это использовать весь стандартный ввод в начале моего скрипта... Я не хочу, чтобы он обрабатывал стандартный ввод по мере его получения, а только когда завершается вся предыдущая команда в цепочке конвейеров.
Итак, мой say_and_pass
скрипт просто такой, который работает для моего варианта использования!
#!/usr/bin/env bash
OUT=$(cat -)
MSG="$*"
say "$MSG"
echo "$OUT"