Перенаправление ввода/вывода и каналы — это инновации скорее UNIX, чем Microsoft, но многие другие бесстыдно скопировали их. Оболочка дает вам доступ к этим возможностям очень понятным способом.
Если вы вводите команду в консоли или текстовом окне, то ваши пальцы обеспечивают стандартный ввод команды, а глаза видят ее стандартный вывод и вывод стандартной ошибки. Однако вы можете выполнить ввод или зафиксировать вывод, заменив свои пальцы и глаза файлом. Выполните команду 1 s со стандартным выводом, обращаясь с экраном как обычно, а затем перенаправив (с помощью символа >) в файл:
admin@serverl:$ Is hello
admin@serverl:$ Is > files.txt admin@serverl:$
Во втором примере перенаправление происходит постепенно. Однако, если появятся ошибки, вы увидите их на экране, а не в файле (вот почему существуют стандартные ошибки):
admin@serverl:$ Is ciao > files.txt
Is: ciao: No such file or directory admin@serverl:~$
Помните, что, если файл f i 1 es. txt существует до запуска вами этих команд, он будет переписан. Если вы хотите просто добавить в файл новое содержимое, а не переписывать его, используйте символы добавления (»):
admin@serverl:~$ Is 1 » files.txt
Если файл f1i 1 es. txt не существует, то он будет создан до начала добавления. Вы также можете перенаправить стандартные ошибки. Вот великолепный вариант, одновременно перенаправляющий стандартный вывод и стандартные ошибки:
admin@serverl:$ Is 1 > files.txt 2> errors.txt
Неэлегантный параметр 2> показывает все волшебство перенаправления стандартных ошибок. Это перенаправление может быть полезно в длительных процессах, например при компиляциях, так что вы сможете просмотреть все сообщения об ошибках позже, а не толкаясь возле экрана.
Если вы хотите перенаправить стандартный вывод и стандартную ошибку в один и тот же файл, выполните следующую команду:
adrninOserverl:$ Is 1 > files.txt 2>&1
Параметр 51 означает «то же место для стандартного вывода», в данном случае являющееся файлом fi 1 es .txt. Сокращение для предыдущей команды:
admin@serverl:$ Is 1 >& files.txt
Используйте символы », а не > везде, где вы хотите добавить информацию, а не переписать ее.
Стандартный вывод также может быть перенаправлен. Здесь мы приводим придуманный нами пример, в котором выполняется поиск имен файлов, содержащих строку foo:
admin@serverl:I Is 1 > files.txt admin@serverl:S grep foo < files.txt admin@serverl:$ rm files.txt
В первом шаге создается временный файл files, txt. Во втором шаге он читается, а в третьем шаге мы занимаемся «гигиеной диска» и освобождаем его. Жизнь временного файла коротка, но продуктивна.
Мы можем скомбинировать три этих шага в один и обойтись без временного файла с помощью лучшего изобретения UNIX — канала. Канал соединяет вывод команды с вводом другой команды. Символ канала |, подобно > и <, позволяет повысить скорость. Стандартный вывод первой команды становится стандартным вводом второй, упрощая наши предыдущие шаги:
admin@serverl:$ Is 1 | grep foo
Вы также можете объединить каналы:
admin@serverl:$ Is 1 | grep foo | wc 1
Эта команда сосчитает количество вхождений строки foo во всех файлах текущей директории.