Как в bash передать содержимое файла в качестве аргумента для другой команды, при этом сохранив переносы строк?

В файле /tmp/1.txt находится следующее содержимое: 

```
111
222
333
```

Как можно передать это содержимое, включая переносы строк, в качестве аргумента для другой команды? 

Например, что-то похожее на следующую команду:

```bash
echo `cat /tmp/1.txt` > /tmp/2.txt
```

Однако данное решение приводит к тому, что переносы строк заменяются на пробелы, и содержимое файла /tmp/2.txt становится:

```
111 222 333
```

Я пробовал различные подходы, но не добился успеха. Как в bash передать содержимое файла как аргумент для другой команды, сохранив переносы строк?
  • 30 января 2025 г. 15:54
Ответы на вопрос 2
В `bash` вы можете использовать конструкцию `cat`, чтобы передать содержимое файла без потери переносов строк, и вы можете просто использовать команду `echo` с использованием ключа `-e` или же обрабатывать текст через команду `printf`. Рассмотрим несколько способов решения вашей задачи.

### Способ 1: Использование `cat`

Вы можете просто перенаправить содержимое файла непосредственно в другую команду. Например, чтобы записать содержимое файла `/tmp/1.txt` в другой файл, используйте:

```bash
cat /tmp/1.txt > /tmp/2.txt
```

### Способ 2: Использование `while read`

Если вам нужно передать содержимое файла как аргумент команде с сохранением переносов строк, вы можете использовать цикл `while read`:

```bash
while IFS= read -r line; do
    echo "$line"
done < /tmp/1.txt > /tmp/2.txt
```

### Способ 3: Использование `printf`

`printf` позволяет более гибко работать с форматированием содержимого:

```bash
printf "%s\n" "$(cat /tmp/1.txt)" > /tmp/2.txt
```

### Способ 4: Команда `awk`

Если вы используете `awk`, вы также можете сохранить многострочный текст:

```bash
awk '{print}' /tmp/1.txt > /tmp/2.txt
```

### Резюме

Если просто нужно скопировать содержимое с сохранением переносов строк, проще всего использовать команду `cat`. Если необходимо модифицировать текст или работать с ним в виде аргументов, подойдут `while read`, `printf` или `awk`.
Оказывается, переменную при передаче надо взять в кавычки. 
Ответ на вопрос, зачем это надо, вот: https://www.altlinux.org/SMART-%D0%BE%D0%BF%D0%BE%...
Там переменная в кавычках передаётся. Если бы я внимательнее смотрел, то и вопроса бы не возникло изначально
Похожие вопросы