tr a A </ etc / hosts | sort -r | pr -d> / etc / hosts

9

В этой строке:

tr a A < /etc/hosts | sort -r |pr -d > /etc/hosts 

каков будет ожидаемый результат? Я знаю, что строчные буквы "а" изменится на прописные буквы "А", но что дальше? Будет ли перезаписан исходный файл, поскольку перенаправление выполняется с тем же именем файла?

tdharrison
источник
Вы должны получить сообщение bash: /etc/hosts: Permission deniedоб ошибке (при условии, что ваша оболочка - bash), если вы не запускаете это как root. /etc/hostsобычно доступен для записи только пользователю root. Если вы используете это как root(что на самом деле не должно), вы получите пустое место, /etc/hostsкак объяснил Майкл Гомер.
Ариэльф

Ответы:

17

Ожидаемый результат - пустой /etc/hostsфайл.

Перенаправление > /etc/hostsпроисходит и усекает файл до запуска программ и trначинает читать из файла.

Чтобы записать выходные данные /etc/hosts, вы можете либо работать с копией файла (или впоследствии переместить выходной файл на место), либо использовать spongeкоманду из moreutils , которая впитывает стандартный ввод и записывает в файл:

tr a A < /etc/hosts | sort -r | pr -d | sponge /etc/hosts

В этом случае каждое «а» /etc/hostsбудет заменено на «А», все строки будут отсортированы в обратном порядке в соответствии с вашей локалью , пустая строка будет вставлена ​​между каждой строкой , и результат будет помещен в /etc/hosts.


Вы также можете найти полезное:

Майкл Гомер
источник
1
Большое спасибо за разъяснение того, что я должен ожидать от того, как это было написано, и как можно написать, чтобы получить ожидаемый результат.
thharrison
moreutils - действительно отличный набор инструментов
Роберт Ридл,