Как я могу обработать необработанные двоичные данные в канале удара?

Для получения всех их, необходимо будет использовать код как отправленный mmckinst, но если Вы просто хотите проверить $releasever можно работать yum version nogroups на RHEL-6.

Другая вещь сделать, в RHEL-6, состоит в том, чтобы просто создать Ваше собственное в /etc/yum/vars.

15
21.08.2011, 02:47
3 ответа

Ваш путь добавляет разрывы строки к каждой вещи, которую он пишет в пространстве любого разделителя ($IFS) использование должно разделить чтение. Вместо того, чтобы разбиться это на новые строки просто берет все это и проводит его. Можно уменьшить весь бит кода выше к этому:

 cat - > $file

Вам не нужен усеченный бит, это усечет и выпишет целый поток STDIN к нему.

Править: При использовании zsh, можно просто использовать > $file вместо кошки. Вы перенаправляете в файл и усекаете его, но если существует что-нибудь зависающее там ожидающий чего-то для принятия STDIN, он будет считан в той точке. Я думаю, что можно сделать что-то вроде этого с ударом кроме Вас, должен был бы установить некоторый специальный режим.

15
27.01.2020, 19:49
  • 1
    я не мог заставить пример перенаправления stdin работать, но изменение примера кошки к> | (У меня есть набор noclobber), работы как очарование. Спасибо за то, что сделали мой день ^.^ –  David Souther 19.08.2011, 22:59
  • 2
    +1 для версии кошки меньше. Всегда избегайте бесполезных кошек ;) –  rozcietrzewiacz 19.08.2011, 23:01
  • 3
    @rozcietrzewiacz: Правда, кроме него была запоздалая мысль, и я был неправ. Это не могло бы быть бесполезным использованием кошки. Единственная вещь, которую Вы смогли делать, > $file. Это только работает первой вещью, которая ищет stdin в родительском сценарии оболочки. В основном весь код David может быть уменьшен до отдельного символа, но я думаю cat - более изящно и меньше проблемы prode, потому что она понята на виде. –  Caleb 19.08.2011, 23:10
  • 4
    Иногда я представляю в виде строки четыре или пять cats вместе, только для раздражения фанатиков –  Michael Mrozek♦ 19.08.2011, 23:32
  • 5
    @MichaelMrozek UUOC: Иногда я называю свои файлы данных cat просто, таким образом, люди, которые настаивают на том, чтобы использовать его обязательно, должны сделать умственную гимнастику для чтения кода. Именованные каналы являются также хорошими целями. –  Caleb 19.08.2011, 23:37

Для чтения текстового файла буквально не используйте плоскость read, который обрабатывает вывод двумя способами:

  • read интерпретирует \ как символ ESC; использовать read -r выключить это.
  • read разделения в слова на символах в $IFS; набор IFS к пустой строке для выключения этого.

Обычная идиома для обработки текстового файла линию за линией

while IFS= read -r line; do …

Для объяснения этой идиомы посмотрите, Почему while IFS= read используемый так часто, вместо IFS=; while read..?.

Для записи строки буквально только используйте плоскость echo, который обрабатывает строку двумя способами:

  • На некоторых оболочках, echo Escape обратной косой черты процессов. (На ударе это зависит ли xpg_echo опция установлена.)
  • Несколько строк рассматривают как опции, например. -n или -e (точный набор зависит от оболочки).

Портативный способ распечатать строку буквально с printf. (В ударе нет никакого лучшего пути, если Вы не знаете, что Ваш вход не похож на опцию к echo.) Используют первую форму для печати точной строки и второй формы, если Вы хотите добавить новую строку.

printf %s "$line"
printf '%s\n' "$line"

Это только подходит для обработки текста, потому что:

  • Большинство оболочек будет дросселировать на нулевых символах во входе.
  • При чтении последней строки у Вас нет способа знать, была ли новая строка в конце или нет. (Некоторые более старые оболочки могут испытать большие затруднения, если вход не заканчивается новой строкой.)

Вы не можете обработать двоичные данные в оболочке, но современные версии утилит на большинстве нельдов могут справиться с произвольными данными. Для передачи всего входа до вывода использовать cat. Продолжение на касательную, echo -n '' сложный и непортативный способ ничего не сделать; echo -n был бы так же, как хороший (или не в зависимости от оболочки), и : является более простым и полностью портативным.

: >| "$file"
cat >>"$file"

или, более простой,

cat >|"$file"

В сценарии Вы обычно не должны использовать >| с тех пор noclobber прочь по умолчанию.

7
27.01.2020, 19:49
  • 1
    благодарит указать на xpg_echo, это - на самом деле проблема, которую я имел где-то в другом месте в моем коде и даже не понял. Ре noclobber, я имею привычку включать его в своем bashrc. –  David Souther 21.08.2011, 18:49

Это сделает точно, что Вы хотите:

( while read -r -d '' ; do
    printf %s'\0' "${REPLY}" ;
  done ;

  # When read hits EOF, it returns non-zero which exits the while loop.
  # That data still needs to be output:
  printf %s "${REPLY}"
) >> ${file}

Действительно отметьте использование памяти все же. Это читает вход разграниченным пустым указателем способом.

Если существует нет \0 пустые байты во входе затем колотят, должен будет сначала считать все содержание входа в память и затем произвести его.

Относительно Вашего усеченного шага:

echo -n '' >| "$file" #Truncate the file

намного более простое и эквивалентное:

> ${file}   #Truncate the file
0
27.01.2020, 19:49

Теги

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