Как переписать с помощью трубы в unix

665
bordenE

Итак, я пытаюсь переписать с помощью канала:

 //reads contents of file| turns lowercase to uppercase | changes $ to # | // then attempts to overwrite original file with new version cat cutTester.txt|tr '[a-z]' '[A-Z]'|tr '$' '#' >cutTester.txt 

но когда я делаю это, он просто стирает файл. Это содержимое файла

 $first$second$third$fourth $fifth$sixth$seventh$eighth $ninth$tenth$eleventh$twelveth $thirteenth$fourthteenth$fifthteenth$sixthteenth $seventeenth$eightteenth$nineteenth$twenty $twenty-one$twenty-two$twenty-three$twenty-four 
1
См. [Предупреждение относительно ''> ''] (// unix.stackexchange.com/q/159513/23408#186126). Scott 7 лет назад 1

1 ответ на вопрос

0
Andrew Palmer

То, что происходит, это то, что вы усекаете cutTester.txt, используя " >" нотацию перенаправления. Затем вы обрабатываете свои trкоманды на перенаправленном выводе пустого входного файла.

Обратите внимание, что следующее также усекает файл:

$ cat cutTester.txt > cutTester.txt 

В частности, если вы разработчик, вы можете использовать такие выражения, x=`eval $x + 1`как evalвыражение, в котором выражение оценивается перед присваиванием. Однако поведение операторов перенаправления не аналогично. Учтите, что реализация перенаправления вывода файла обратно на самого себя, скорее всего, потребует от оболочки создания временных файлов за кулисами и не будет такой простой и эффективной операцией, как простое переназначение переменной (которая существует только в памяти).

К счастью, достаточно просто создать временный файл самостоятельно:

#!/bin/bash  # reads contents of file| turns lowercase to uppercase | changes $ to # | # then attempts to override original file with new version  cat cutTester.txt | tr '[a-z]' '[A-Z]' | tr '$' '#' > cutTester.tmp; mv cutTester.tmp cutTester.txt 
Вы, вероятно, захотите заменить `;` на `&&`, чтобы не потерять исходный файл, если команда не выполнена или прервана. Кроме того, команда `cat` просто тратит время на создание дополнительной копии. Просто перенаправьте ввод tr, `tr spectras 7 лет назад 0