Однострочный наследственный документ - Возможно ли в Bash?

Команда sed r поместит содержимое указанного файла в вывод перед чтением следующей строки ввода. К сожалению, вы не можете указать 0 в качестве адреса для этой команды, поэтому нет способа вставить содержимое файла перед первой строкой ввода (не копаясь в удерживаемом пространстве).

Однако вы можете просто использовать старый добрый кот . В конце концов, это команда для объединения файлов:

$ cat file1.txt file2.txt >out && mv out file2.txt

Чтобы убедиться, что вы записываете во временный файл, который еще не существует, можно использовать утилиту mktemp :

$ tmp="$(mktemp)" && cat file1.txt file2.txt >"$tmp" && mv "$tmp" file2.txt

Это немного неудобно для командной строки, но является хорошей мерой предосторожности в любом сценарии, который должен записывать во временный файл.

1
10.06.2017, 21:18
2 ответа

Да, но вы должны использовать здесь-строку , а не здесь-документ:

cat >"$HOME/myRep/tiesto" <<<'tiesto'

Это отправит строку tiesto на cat на своем стандартном вводе, и он запишет строку в файл $HOME/myRep/tiesto через перенаправление своего стандартного вывода.

Обратите внимание, что здесь-строки не являются стандартными, а реализованы по крайней мере zsh (откуда они берутся, в то же время, что и UNIX-версия rc, хотя это rc и его производные, такие как es или akanga не добавляют дополнительный символ новой строки в конце), ksh93, bash , мкш и яш.

11
27.01.2020, 23:11

Вы можете поместить здесь -документ (вместо здесь -строки )в одной строке, используя:

eval $'cat << TEST > ~/myRep/tiesto\ntiesto\nTEST'

Технически это одна строка кода, но $'...'будет преобразован в новый 3-строчный код, который снова evalунифицирован.

Используя eval, вы всегда можете поместить любой шелл-код в одну строку.

С оболочками, которые не поддерживают $'...', можно сделать:

eval "$(printf 'NL="\n"')"; eval "cat << TEST > ~/myRep/tiesto${NL}tiesto${NL}TEST"

или

eval "$(printf 'cat << TEST > ~/myRep/tiesto\ntiesto\nTEST')"

Конечно здесь,

echo tiesto > ~/myRep/tiesto

было бы намного проще. Или для нескольких строк:

printf '%s\n' "line 1" "line 2" > ~/myRep/tiesto
1
27.01.2020, 23:11

Теги

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