Занятый файл поля Read линию за линией

Если там не будут существовать инструменты, чтобы заставить двоичные файлы Linux работать на Солярисе, Вы не сможете использовать двоичные файлы SDK Android на Солярисе, кроме основанных на Java. Если SDK Android является открытым исходным кодом, Вы могли бы, конечно, скомпилировать его на solaris, однако я не мог определить, является ли это открытый исходный код.

Альтернатива должна была бы настроить Linux (виртуальная) машина. Моим предпочтительным распределением был бы стабильный Debian (который является тем, что я использую для разработки Android).

4
19.08.2013, 08:26
2 ответа

Мне удалось решить мое требование при помощи

head testInputs/test1 -n $getLineNum | tail -n 1

getLineNum увеличивает на каждом цикле с условием продолжения.

но это не точный ответ для моего вопроса.

Также необходимо добавить некоторую вещь как #EOF в последней строке и искать его для повреждения цикла.

0
27.01.2020, 20:47
  • 1
    Почему необходимо снабдить префиксом busybox к каждой команде? Разве Вы не вводите ту командную строку в busybox оболочка? Делает ту оболочку не, имеют a read встроенный? (что делает type read скажите Вам там?). –  Stéphane Chazelas 19.08.2013, 11:50
  • 2
    @StephaneChazelas, который я пишу этому сценарию для встроенного устройства, так для проверки busybox апплета, называют вместо фактической команды, я использую busybox префикс, я использую Оболочку Bourne '/bin/sh' –  limovala 19.08.2013, 12:32
  • 3
    Но путем выполнения, таким образом, Вы заканчиваете тем, что использовали его по-другому по сравнению с тем, что было бы Ваше встроенное устройство (Вы не хотите называть утилиты как этот, поскольку это означает повторно выполнять busybox для каждой команды, которая является отходами, так как в наше время busybox может назвать утилиты, не повторно выполняя себя). busybox назовет его собственные команды в приоритете. Если Вы не хотите называть утилиты от /bin или /usr/bin, удалите те каталоги из $PATH. –  Stéphane Chazelas 19.08.2013, 12:41
  • 4
    @StephaneChazelas благодарит, я Обновлю свои сценарии –  limovala 19.08.2013, 12:57

read встроенная оболочка (она не могла установить переменную оболочки, если бы это не было).

Так, если Ваш busybox sh на основе ash, это:

while IFS= read -r line <&3; do
  printf '%s\n' "$line"
done 3< "$InputFile"

Как в любой оболочке POSIX. Но как с любой оболочкой, с помощью while read циклы к тексту процесса являются обычно плохой практикой сценариев оболочки.

Выше, Вам нужно:

  • IFS= в других отношениях ведущие и запаздывающие незавершенные пробелы и вкладки разделяются от строк
  • -r, иначе обратные косые черты рассматривают как символ ESC и удаляют (если не оставлено)
  • printf, нет echo который не работал бы на строки, которые являются, например, -nene
  • "$line" заключенный в кавычки (нет $line) иначе содержание строки разделяется на пробелах и вкладках и globbing расширенных шаблонах.
  • <&3 и 3< ..., если Вам нужен доступ к исходному stdin в цикле.

Если файл содержит символы после последней строки, и Вы хотите отобразить их, можно добавить после цикла:

[ -z "$line" ] || printf %s "$line"

Обратите внимание, что тот цикл не может обработать двоичные данные ( NUL символ).

12
27.01.2020, 20:47
  • 1
    Это похоже на ненужную сложность к тому, что должно быть рабочим примером от OP. –  jordanm 19.08.2013, 08:53
  • 2
    @jordanm, я отредактировал ответ для приведения причин для добавленной сложности. –  Stéphane Chazelas 19.08.2013, 09:16
  • 3
    Возможно, это могло быть лучше с while IFS= read -r line <&3 || [ -n "$line" ] ; do чтобы не повторять внутренности цикла на непустом указателе длятся строку. Да, это все еще не обработает символ NUL. –   18.01.2016, 23:35

Теги

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