Чтение всего файла в память?

В наши дни это становится очень распространенной проблемой, попробуйте это следующим образом:

ssh -t auser@something.com ssh -t aserver 'su - buser -c \"tail -f /logfile\"'
7
04.12.2012, 03:40
2 ответа

Один из способов такой:

$ A=$(<file)

Вместо переменной, лучшим вариантом будет чтение в массив, что облегчает доступ к разным строкам:

$ OIFS=$IFS
$ IFS=$'\n'
$ arr=($(<file))
$ IFS=$OIFS
6
29.04.2021, 00:52

Bash не поддерживает нулевые байты в переменных. foo=$(cat file) заставляет $foo содержать начало файла, вплоть до первого нулевого байта. Замена команды также удаляет из файла все конечные новые строки. Например, если файл состоит из четырех байт (a, новая строка, новая строка, новая строка), то foo содержит только a, как если бы файл содержал только этот один байт.

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

foo=$(cat file; echo a)
foo=${foo%a}

До сих пор все это работало во всех оболочках в стиле Bourne/POSIX (ash, ksh, bash, ...). Bash ≥4.0 имеет более быстрый способ чтения файла в переменную: mapfile.

mapfile <file foo

Просто не существует способа запихнуть нулевой байт в переменную bash. Если вам это нужно, у вас есть несколько вариантов:

  • Используйте zsh.
  • Использовать Perl.
  • Хранить данные во временном файле (что кажется бесполезным в данном случае, так как данные уже находятся в файле).
  • Закодируйте входные данные и декодируйте их обратно, например, с помощью base64 и base64 -d.
7
29.04.2021, 00:52

Теги

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