понимание перенаправления оболочки на несуществующие файлы

StackOverflow https://stackoverflow.com/questions/1430828

  •  07-07-2019
  •  | 
  •  

Вопрос

ls > ls.out

это также включит ls.out в список.Мое понимание таково:> (оператор перенаправления вывода оболочки сначала создает файл (для получения стандартного вывода), если он еще не существует, а затем запускается команда ls, которая включает только что созданный файл ls.out в выходные данные.Правильно ли это?Если нет, не могли бы вы, пожалуйста, подробнее описать работу этой команды.

Аналогично

wc temp > temp

Выведет 0 0 0 temp внутри только что созданного временного файла.

Такое поведение shell интересно.Интересно, как это на самом деле работает.Кстати, оба являются упражнениями из книги "Среда программирования Unix".Как я уже упоминал ответ выше, я хочу, чтобы какой-нибудь эксперт исправил мое понимание.

Это было полезно?

Решение

При перенаправлении стандартного вывода с >, оболочка создаст файл (как пустой файл), если он еще не существует.Кроме того, этот файл открывается до того, как оболочка разветвляется и выполняет выполняемую команду.Когда вы делаете wc temp > temp, оболочка открывает файл для записи, а затем разветвляет и выполняет wc, передавая в процессе свои дескрипторы открытых файлов.

Другие советы

Чрезмерное упрощение:

ls просматривает индекс (запись каталога), созданный перенаправлением.

wc может видеть индекс, созданный перенаправлением, но когда он просматривает содержимое, они пусты, потому что это (wc) еще не написал их.

Редактировать:

Во-первых, в обоих случаях перенаправление (>ls.out или >temp) создает пустой файл.Запись (inode) в каталоге создается для указания местоположения файла и содержит некоторую информацию о нем.Смотрите статью в Википедии о индексные индексы.

Далее, в случае ls, все записи в каталоге, включая тот, который предназначен для ls.out который был только что создан, считываются и записываются в stdout (который в данном случае становится содержимым ls.out).

Или, в случае wc, он подсчитывает количество символов новой строки, слов и байтов недавно созданного файла под названием temp который пуст таким образом, он записывает нулевые значения в файл после это не имеет значения (ничего).

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

Для лучший способ сравнить что ls и wc выполняете, попробуйте эту команду (когда ls.out не существует):

ls -l > ls.out

Вы должны увидеть, что размер файла для ls.out равен нулю в соответствии со списком, содержащимся внутри (cat ls.out), но если вы сделаете ls -l ls.out вы увидите, что это не ноль.Это соответствует тому, что, как вы видите, происходит с wc.

рассмотреть wc -l temp > temp

Если temp уже существовал и имел, скажем, 20 строк, все еще являющихся результатом cat temp после выполнения приведенной выше команды температура будет равна 0.

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

В действии > temp сначала выполняется оболочкой, а затем wc -l temp выполняется.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top