O que está acontecendo é que você está truncar cutTester.txt
usando a notação de redirecionamento " >
". Você está processando seus comandos tr
na saída redirecionada de um arquivo de entrada vazio.
Observe que o seguinte também trunca o arquivo:
$ cat cutTester.txt > cutTester.txt
Particularmente, se você for um desenvolvedor, pode estar acostumado a escrever declarações como x='eval $x + 1'
, nas quais a expressão eval
é avaliada antes da atribuição. O comportamento dos operadores de redirecionamento não é análogo, no entanto. Considere que a implementação de redirecionar a saída de um arquivo de volta para si exigiria que o shell criasse arquivos temporários nos bastidores e não seria uma operação tão direta ou eficiente quanto simplesmente reatribuir uma variável (que existe apenas na memória). / p>
Felizmente, é bastante simples criar explicitamente um arquivo temporário:
#!/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