1

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

    //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 ответ1

0

Происходит следующее: вы 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .