2015-04-27 3 views
3

Как я могу перенаправить ввод и вывод в один и тот же файл вообще? Я имею в виду, что есть -o для команды sort, и могут быть другие такие параметры для различной команды. Но как я могу вообще перенаправить ввод и вывод в тот же файл, не сбивая файл?перенаправление ввода и вывода в тот же файл

Например: sort a.txt > a.txt уничтожает содержимое файла a.txt, но я хочу сохранить ответ в том же файле. Я знаю, что могу использовать mv и rm после использования временного файла, но можно ли это сделать напрямую?

+0

Вы пытались использовать 'sort a.txt >> a.txt'. Это должно быть добавлено к документу txt, а не перезаписывать его – ryekayo

+1

Это может также работать вечно. –

+0

Кроме того, я не хочу добавлять. –

ответ

0

Не, если команда не поддерживает выполнение самой mv после ее завершения.

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

Вот почему у некоторых команд есть варианты для этого (для того, чтобы избавить вас от необходимости использовать command input > output && mv output input или подобное вам).

2

Если вы знакомы с PISIX apis, вы поймете, что opening a file имеет несколько возможных режимов, но наиболее распространенные из них читаются, записываются и добавляются. Вы вспомните, что если вы откроете файл для записи, вы его обрезаете немедленно.

Переадресация напрямую аналогична общим режимам.

> x # open x for writing 
< x # open x for reading 
>> x # open x for appending 

Там нет оболочки редирект, которые эквивалентны режимам, как O_RDWR, к сожалению.

Вы можете проверить для этого с помощью noclobber option, но вы не можете открыть файл для чтения и записи с использованием операторов перенаправления оболочки. Вы должны использовать временный файл.

1

Как указано на BashPitfalls entry #13, вы можете использовать sponge от moreutils, чтобы «впитать» данные перед открытием файла для его записи.

Примера: sort a.txt | sponge a.txt

Хотя BashPitfalls страница упоминает, что может быть потеря данных, страница людей для губки говорит

Он также создает выходной файл атомарен путем переименования временного файла в место [...]

Это сделало бы его более опасным, чем запись в файл temp и выполнение mv.

Кредит Charles Duffy для указания записи BashPitfalls в комментариях.

Смежные вопросы