Переопределение файла в bash в одной трубе - PullRequest
0 голосов
/ 26 февраля 2019

Результатом cat file1 | cat > file1 является пустой файл1.

Результатом head file1 | cat > file1 также является пустой файл1.

Конечно, реальный канал должен иметь больше шагов -инструменты и операции внутри.

Есть ли способ сохранить преобразованный прочитанный контент?

Реальный случай - source .env && cat file1 | envsubst > file1

Ответы [ 3 ]

0 голосов
/ 26 февраля 2019

Губка делает это за тебя.Вам нужно установить его отдельно, хотя он обычно не включается в ОС.

cat test | sponge | cat > test

Оставит вас с содержимым, которое было изначально в файле "test".

Чтобы получить губкув Ubuntu или Redhat вам необходимо установить пакет moreutils.

0 голосов
/ 26 февраля 2019

Спасибо, но правильный ответ:

cat file1 | envsubst | sponge file1

Это (от Веда) неправильное использование губки

cat file1 | envsubst | sponge | cat > file1

0 голосов
/ 26 февраля 2019

Единственный вариант - что-то вроде (head file1 | cat > tmp_file) && mv tmp_file file1.Другими словами, вы должны записать во временный файл и , а затем заменить исходный файл временным.

По сути, bash должен открыть все файлы и каналы до того, как он запустится execкаждый этап в конвейере.Как только он откроет ваш выходной файл для перезаписи, он будет перезаписан.

...