2016-01-13 4 views
0

У меня есть эти два файла, yolo.txt и bar.txt:Баш перенаправление файлов не работает

yolo.txt:

a 
b 
c 

bar.txt:

c 

Я следующую команду , который получает мне желаемый результат:

$ cat yolo.txt bar.txt | sort | uniq -u | sponge 
a 
b 

Но когда я добавляю переназначения (>) заявление, выходные изменения:

$ cat yolo.txt bar.txt | sort | uniq -u | sponge > yolo.txt && cat yolo.txt 
c 

Я ожидал, что выход останется на прежнем уровне, и я совершенно запутался. Пожалуйста, помогите мне.

+1

Вы знаете про губку, но вы не знаете, зачем это необходимо? Как это получилось? –

ответ

3

> yolo.txt перенаправление оболочки происходит до запуска любой из команд. В частности, оболочка открывает yolo.txt для записи и обрезает ее перед выполнением cat yolo.txt bar.txt. Таким образом, к моменту открытия catyolo.txt, yolo.txt пуст. Поэтому линия c в bar.txt уникальна, поэтому uniq -u передает ее.

Я думаю, вы хотели использовать sponge, чтобы избежать этой проблемы, так как это то, что для sponge для. Но вы использовали его неправильно. Это правильное использование:

cat yolo.txt bar.txt | sort | uniq -u | sponge yolo.txt && cat yolo.txt 

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

Смежные вопросы