Как в Bash можно сохранить многострочное содержимое файла целиком в переменную?

Для примера рассмотрим файл /etc/hosts. 

Если я попытаюсь сохранить его содержимое следующим образом: 
```bash
file_content="$(cat /etc/hosts)"
```
или 
```bash
file_content="$(printf "%s" "$(cat /etc/hosts)")"
```
то все переносы строк в конце файла будут удалены. Я предполагаю, что это связано с использованием конструкции $().

**Вопрос:**  
Как в bash можно сохранить многострочное содержимое файла в переменную, включая все пробелы, отступы и переносы строк в конце файла?
  • 3 декабря 2024 г. 14:23
Ответы на вопрос 2
В Bash есть несколько способов сохранить многострочное содержимое файла в переменную, включая все пробелы, отступы и переносы строк. Использование конструкции `$(...)` действительно может привести к удалению завершающих переносов строк. Однако, можно воспользоваться другими способами.

Один из методов — использовать `read` с опцией `-d` для считывания содержимого файла. Вот как это можно сделать:

```bash
file_content=""
while IFS= read -r line; do
    file_content+="$line"$'\n'
done < /etc/hosts
```

В этом примере:

- `IFS=` отключает разделитель поля, чтобы сохранять пробелы в начале и конце строк.
- `read -r` предотвращает экранирование обратных слэшей.
- Мы добавляем строку к переменной `file_content` и добавляем перенос строки `$'\n'` вручную, чтобы сохранить форматирование.

Еще один способ — использовать `cat`, но с приведением к строке с помощью `printf` или здесь-доков (также известный как heredoc):

```bash
file_content=$(< /etc/hosts)
```

В этом случае, использование сигнатуры `$(< filename)` означает, что содержимое будет прочитано в переменную целиком, и при этом все переносы строк будут сохранены. Однако, данный метод также удалит все завершающие переносы строк, если они есть.

Если вам нужно сохранить все переносы строк и пробелы (включая завершающие), то рекомендую использовать первый способ с циклом `while`. 

Теперь вы сможете работать с переменной `file_content`, и в ней будет содержаться все содержимое файла `/etc/hosts`, включая все елементы форматирования.
cat > foo.txt <<EOT
bar
baz
EOT
Похожие вопросы