То, что происходит, это то, что вы усекаете 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