При использовании >
файл открывается в режиме усечения, поэтому его содержимое удаляется до того, как команда попытается его прочитать.
При использовании >>
файл открывается в режиме добавления, поэтому существующие данные сохраняются. Однако в этом случае все еще довольно рискованно использовать один и тот же файл для ввода и вывода. Если файл достаточно велик, чтобы не соответствовать размеру входного буфера чтения, его размер может увеличиваться до бесконечности, пока файловая система не заполнится (или не будет достигнута квота на диске).
Если вы хотите использовать файл как для ввода, так и для вывода с командой, которая не поддерживает модификацию места, вы можете использовать несколько обходных путей:
Используйте промежуточный файл и перезапишите исходный файл, когда это будет сделано, и только в том случае, если при запуске утилиты не возникло ошибок (это самый безопасный и распространенный способ).
fold foo.txt > fold.txt.$$ && mv fold.txt.$$ foo.txt
Избегайте промежуточного файла за счет возможной частичной или полной потери данных в случае ошибки или прерывания. В этом примере содержимое foo.txt
передается в качестве входных данных в подоболочку (внутри скобок) перед удалением файла. Предыдущий инод остается активным, поскольку подоболочка сохраняет его открытым во время чтения данных. Файл, написанный внутренней утилитой (здесь fold
) с тем же именем (foo.txt
) указывает на другой индекс, потому что старая запись каталога была технически удалена, во время процесса есть два разных «файла» с одинаковыми именами. Когда подоболочка заканчивается, старый инод освобождается и его данные теряются. Будьте осторожны, чтобы убедиться, что у вас достаточно места для временного хранения старого и нового файлов одновременно, иначе вы потеряете данные.
(rm foo.txt; fold > foo.txt) < foo.txt