понимание перенаправления оболочки на несуществующие файлы - PullRequest
0 голосов
/ 16 сентября 2009
ls > ls.out

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

Аналогично * * 1004

wc temp > temp

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

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

Ответы [ 3 ]

6 голосов
/ 16 сентября 2009

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

1 голос
/ 16 сентября 2009

упрощение:

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

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

Edit:

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

0 голосов
/ 16 декабря 2009

считают wc -l temp > temp

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

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

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

...