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

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

Например, вот команда, которую я использую:

tr -d '\n' < newfile.ppm 

Я хочу вывести результаты в тот же самый файл, поэтому я делаю следующее:

tr -d '\n' < newfile.ppm > newfile.ppm

Почему это не работает и как это можно сделать?

решение1

Это чрезвычайно распространенная «ловушка».

Когда вы перенаправляете stdout или stderr для записи в файл, оболочка сначала обрезает файл, чтобы подготовить его к записи. Так что происходит примерно следующее:

  1. Ваша оболочка устанавливает stdin вnewfile.ppm
  2. Ваша оболочка обрезается newfile.ppmдо длины 0
  3. Ваша оболочка устанавливает stdout вnewfile.ppm
  4. Ваша оболочка запускается tr -d '\n'. Как видите, на данный момент содержимое newfile.ppmуже исчезло, так что читать нечего.

Чтобы обойти это, просто выведите в другой файл. Вы можете переименовать его позже

решение2

Это сделает то, что вам нужно.

[stephan@stephan] ~ 
$ echo "meh                                    
" > file
[stephan@stephan] ~ 
$ cat file | tr -d '\n' > file ; cat file 
meh

Связанный контент