перенаправление bash на файлы не работает

У меня есть два файла, yolo.txt и bar.txt:

йоло.txt:

a
b
c

бар.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

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


person mogoh    schedule 13.01.2016    source источник
comment
Вы знаете о губке, но не знаете, зачем она нужна? Как это произошло?   -  person Charles Duffy    schedule 13.01.2016


Ответы (1)


Перенаправление оболочки > yolo.txt происходит до запуска любой из команд. В частности, оболочка открывает yolo.txt для записи и усекает его перед выполнением cat yolo.txt bar.txt. Таким образом, к тому времени, когда cat открывает yolo.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 в качестве аргумента командной строки вместо использования перенаправления оболочки.

person rob mayoff    schedule 13.01.2016