Почему Баш Перенаправление произойдет * до * запускается команда, если «>» после команды?

голоса
5

Недавно я попытался перечислить все изображения, расположенные в папке у меня было (несколько сотен) и поместить их в файл. Я использовал очень простую команду

ls > image_names.txt

Мне было скучно , и решил заглянуть внутрь файла и понял , что image_names.txt находился в файле. Тогда я понял, порядок операций , выполняемый не то , что я думал. Я прочитал команду , как слева направо, в два отдельных этапа:

  1. ls (Первый список всех имен файлов)
  2. > image_names.txt (Затем создайте этот файл и трубы здесь)

Почему это создает файл первым , то список всех файлов в каталоге, несмотря на lsкоманду наступающей первым?

Задан 20/10/2018 в 04:56
источник пользователем
На других языках...                            


1 ответов

голоса
2

При использовании перенаправление вывода, оболочка нужно место, чтобы положить ваш вывод (предположим, это было очень долго, то все это может быть потеряно на прекратить или исчерпывают все рабочая память), поэтому первый шаг, чтобы открыть выходной файл для потоковой передачи выход из стандартного вывода Выполненных команд.

Это особенно важно знать, в такой команде

cat a.txt | grep "foo" > a.txt

так как открыто первые и не в режиме добавления будет усеченным, то есть нет входа для cat. Таким образом, поведение вы ожидаете , что линии будут отфильтрованы из a.txt и заменить a.txt не будет на самом деле произошло. Вместо этого вы просто потеряете содержимое a.txt.

Ответил 20/10/2018 в 05:04
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more