понимание перенаправления оболочки на несуществующие файлы
-
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
выполняется.