Аналог dev null в windows
Обновлено: 03.07.2024
Я думаю, вам нужен NUL , по крайней мере, в командной строке или в пакетных файлах.
не создает файл.
(У меня полагать то же самое верно, если вы пытаетесь создать файл программно, но я не пробовал.)
В PowerShell вам нужен $null :
@ Джим: Интересно - я не знал, что вы можете писать в пути вне / dev / null, как если бы это был каталог. Хм.
В Ubuntu: echo blah> /dev/null.txt bash: /dev/null.txt: Permission denied Может быть, это что-то специфическое для вашей системы .
@capthive: есть разница между /dev/null.txt и /dev/null/foo.txt.
Я просто посмотрел на это еще раз и отказываюсь от своего первоначального утверждения. Я писал код, и ошибка проглатывалась. Удаляю, чтобы случайно никто не принял за правду.
Статья в Википедии / dev / null также указывает, что PowerShell обозначает $ null как приемлемый . Только что попробовав это с помощью wget (часть GnuWin32), он принял $null в качестве пункта назначения, если указан с помощью --output-document=$null . NUL короче, поэтому я буду использовать его!@Marwelln: Это точно не в Windows 8.0. echo foo > NULL , затем echo foo > NUL , затем dir n* покажет NULL , но не NUL .
Для людей, которые ищут "специальные" файлы Unix под Windows: здесь - это драйверы устройств /dev/random и /dev/zero для Win32.
Обратите внимание, что программе, которая часто выводит на стандартный вывод, потребуется такое же количество времени для завершения, если она будет перенаправлена на NUL, хотя печатать нечего.
@CoDEmanX: Это не мой опыт. Запись в консоль или даже в файл может занять значительное время. Я только что протестировал это с помощью программы, написавшей "Hello there" на стандартный вывод 10000000 раз. Перенаправление в файл (на SSD) заняло 18 секунд. Перенаправление на NUL заняло 4 секунды. Отсутствие перенаправления через некоторое время заставило меня сдаться из-за отсутствия терпения .
В моем тесте на Windows 7 с обычным жестким диском программа-пример заняла 0,67 секунды для записи в файл, 1,4 секунды для NUL и несколько минут для печати на консоль. Я думаю, это бывает по-разному, и есть несколько влияющих факторов.
Вы также можете использовать C:\Windows\System32\drivers\null.sys .
Прямо сейчас я пытаюсь перенести код python с linux на windows. В разных местах random чисел генерируются путем чтения из /dev/random. есть ли способ имитировать /dev/random на Windows? Я ищу решение, которое позволило бы сохранить код пригодным для использования на linux.
Я думаю , что вы хотите NUL , по крайней мере, в командной строке или пакетных файлах.
не создает файл.
(Я считаю , что то же самое верно, если вы попытаетесь создать файл программно, но я не пробовал.)
В PowerShell вы хотите $null :
Вы также можете использовать этот специальный файл "nul" через перенаправление.
NUL в Windows, похоже, на самом деле является виртуальным путем в любой папке. Точно так же, как .. , . в любой файловой системе.
Используйте любую папку, за которой следует NUL, будет работать.
имеют тот же эффект, что и /dev/null на Linux.
Это было проверено на Windows 7, 64 bit.
Джон Скит прав. Вот страница драйвера устройства Nul в встроенной документации Windows (я понятия не имею, почему ее нет где-то еще. ).
NUL также работает программно. E.g. следующий:
работает, как и ожидалось, без создания файла. (MSVC++ 12.0)
Если вам нужно выполнить в Microsoft Windows эквивалент символической ссылки на /dev/null в Linux, вы откроете cmd администратора и наберете:
Для файлов:
Или для каталогов:
Это сохранит файл/директорию всегда в 0 байтах и по - прежнему будет возвращать успех при каждой попытке записи.
Я пытаюсь настроить среду разработки Ruby на Windows. Пока что это довольно vanilla, то есть он в значительной степени состоит только из Ruby (1.9.1), Bundler (1.3.5) и нескольких случайных драгоценных камней. Теперь, когда я пытаюсь запустить Bundler, я получаю следующее исключение.
На самом деле два вопроса: Я создаю тег Subversion с помощью своего скрипта Perl. Прежде чем я создам этот тег, я хочу посмотреть, существует ли он уже. Один из способов сделать это-запустить svn ls $url и посмотреть, не выйдет ли команда из строя: my $error = system(svn ls $url); if ( $error )
Вы должны использовать start и $NUL для этого в Windows PowerShell :
Введите эту команду, предполагая, что mySum -это имя вашего приложения, а 5 10 -аргументы командной строки, которые вы отправляете.
Команда start запустит отсоединенный процесс, аналогичный эффекту & . Параметр /B запрещает запуску открывать новое окно terminal, если запущенная программа является консольным приложением. а NUL -это Windows' эквивалент /dev/null . 2>&1 в конце перенаправит stderr на stdout, который все перейдет на NUL .
Похожие вопросы:
Я запускаю симулятор нагрузки Java (через мясорубку) и отключил большую часть регистрации, чтобы упростить работу. На Unix мой файл log4j выглядит так, как будто приведенный ниже файл имеет значение.
Привет, я хочу использовать пакет под названием Kunststube-CSRFP в своем проекте Проблема в том, что пакет выдаст исключение на машинах windows, потому что dev/random не является законным для.
С exec() страницы руководства: Если программа запускается с помощью этой функции, то для того, чтобы она продолжала работать в фоновом режиме, выходные данные программы должны быть перенаправлены в.
Прямо сейчас я пытаюсь перенести код python с linux на windows. В разных местах random чисел генерируются путем чтения из /dev/random. есть ли способ имитировать /dev/random на Windows? Я ищу.
Я пытаюсь настроить среду разработки Ruby на Windows. Пока что это довольно vanilla, то есть он в значительной степени состоит только из Ruby (1.9.1), Bundler (1.3.5) и нескольких случайных.
На самом деле два вопроса: Я создаю тег Subversion с помощью своего скрипта Perl. Прежде чем я создам этот тег, я хочу посмотреть, существует ли он уже. Один из способов сделать это-запустить svn ls.
Я пытаюсь реализовать драйвер устройства для псевдо-устройств /dev/null & /dev/zero в C. Во-первых, я хотел бы знать, чем эти два понятия отличаются в использовании? Мой план состоит в том.
У меня есть приведенный ниже код для запуска кода, который использует mongodb в файле .sh. Я запускаю свой код в windows, но думаю, что эти команды предназначены для Linux. Я был бы очень.
Разделы можно пропускать без ущерба для понимания, ровно как и любые непонятные/неинтересные места в них
Перенаправления
Да, в Windows есть аналог многоликой команды cat , которая является одной из команд, выражающих суть UNIX'а. Это команда type . Она принимает один или несколько аргументов — имена файлов.
Если нужно, чтоб type читал с экрана (например, если нужно создать файл, на лету наполнив его содержимым), то нужно набрать
con — это аналог /dev/tty (подробнее об этом в следующем разделе).
То есть вышеприведённая команда является аналогом UNIX'овой команды cat /dev/tty > file или cat - > file или просто cat > file .
Когда вы закончите набирать файл, нажмите на новой строке Ctrl-Z и Enter. Это признак конца файла, аналог Ctrl-D в UNIX'е.
Сейчас будет куча технических подробностей про Ctrl-D и Ctrl-Z, их можно пропустить и перейти к следующему разделу.
В UNIX'е, когда юзер нажимает Ctrl-D, эта комбинация обрабатывается ядром (если дело происходит в «настоящем терминале», т. е. в /dev/tty1 , например [правда, ситуация может поменяться после переноса VT в userspace]) либо эмулятором терминала (если программа запущена, скажем в gnome-terminal или konsole). А запущенное приложение получает EOF (End Of File, конец файла) в чистом виде (а не саму комбинацию клавиш или символ Ctrl-D). То есть как если бы ввод просто закончился. Иными словами, getchar в приложении возвращает EOF , а read — 0.
В Windows Ctrl-Z воспринимается просто как один из символов, и getchar вернёт просто код этого символа. И некоторые программы (например, наш type ) воспринимают этот Ctrl-Z как конец файла. Поэтому в остальных программах Ctrl-Z может не работать.
/dev/null, /dev/tty и т. д.
Аналог /dev/null — это файл nil . Причём он как бы присутствует в каждой папке. Это, видимо, тянется со времён старых версий DOS'а, когда не было папок. Поэтому нельзя создать файл с именем nil (и с именами остальных устройств, о которых речь пойдёт дальше). Также, если вам в cmd-скрипте понадобилось проверить существование папки с именем foo , проверьте сущетвование файла foo/nil . Ведь nil есть в каждой папке. Таким образом, проверка существования папок и файлов в cmd-скриптах сделана куда менее красиво чем в UNIX'е (в UNIX'е проверка файла с именем foo делается так: [ -f foo ] , а папки с именем foo — так: [ -d foo ] ).
Теперь о других устройствах. Аналог /dev/tty — это con , я думаю, от слова console. Причём con — это аналог именно /dev/tty , а не /dev/console , так как в Windows у каждого окна командной строки con свой.
Аналоги /dev/ttyS0 , /dev/ttyS1 , /dev/ttyS2 , /dev/ttyS3 — это com1 , com2 , com3 , com4 . Это файлы serial console, они же COM-порты, они же последовательные порты.
/dev, /dev/sda1, .
После прочтения предыдущего раздела у вас мог возникнуть вопрос: и что, всё? /dev/null , /dev/tty и ещё несколько штук девайсов? А где /dev/sda1 и прочие бесчисленные устройства? Ведь в GNU/Linux'е папка /dev может содержать сотни файлов!
Ответ таков: да, в Windows есть целая папка с устройствами. Это \Devices . Её сложно посмотреть через обычный пользовательский интерфейс. Но там лежат файлы типа \DevicesHardDisk1Volume1 (название точно не помню) — это аналог GNU/Linux'ового /dev/sda1 .
По-видимому, эти файлы появились в NT-шных версиях Windows'а и не тянутся с DOS'овых времён, в отличии от устройств из предыдущего раздела.
Пайпы, они же конвееры
cmd1 | cmd2 , так же, как и в UNIX. Причём перенаправления появились ещё в DOS'е, а вот пайпы появились только в винде (ещё бы, ведь для пайпов нужна мультизадачность).
/etc/fstab
Его аналог — это ветка HKEY_LOCAL_MACHINESYSTEMMountedDevices в реестре Windows (да, да, в винде, как и в UNIX, есть понятие монтирования). Кстати, если у вас до этого были проблемы с переносом установленного Windows'а с одного раздела на другой, или с переименованием дисков в Windows'е или с чем-то ещё подобным, то — вот оно, решение!
Сейчас будет рассказ для тех, кто задумал перенести винду с одного раздела на другой. Остальные могут его пропустить и перейти к следующему разделу.
Если, скажем, вы перенесли Windows с одного раздела на другой, то после этого нужно сделать два шага: разобраться с загрузчиком и его конфигами (об этом в следующем разделе) и подредактировать этот самый ключ реестра (в общем-то так же, как и в GNU/Linux'е: GRUB + fstab). Если ключ не подредактировать, то винда загрузиться не сможет, так начнёт грузиться с нового раздела (то есть того, на который мы копирнули винду), а продолжит — со старого (то есть того, с которого мы копирнули винду). Все системные вещи будут загружены с нового, а всякие Касперские — со старого. Итак, нужно удалить из этой ветки все записи, кроме записи "(По умолчанию)". Тогда винда забудет всё, что знала о разделах и при следующем запуске будет считать своим разделом тот, с которого запустилась (что нам и надо). Кароче говоря, автоматически определит разделы. В GNU/Linux'е такой трюк не прокатывает: если вы снесёте fstab, то система не загрузится нормально.
Правда, тут возникает вопрос: а как подредактировать реестр, не загружаясь в него? Хм, я для этого использовал Windows PE, который входил в комплект пиратской сборки винды, поэтому я подробности рассказывать не буду.
И ещё: весь материал этого раздела проверялся только на Windows XP.
Есть ещё один вариант: сперва почистить реестр, а потом копирнуть винду. Однако, я это не проверял. Не факт, что винда даст вам отредактировать этот ключ реестра и что она не заполнит его снова при выключении. Можно сделать так: отредактировать реестр, и сразу же, не выключая комп, копирнуть запущенную винду на другой раздел. Но и это тоже не проверялось. И вот вам ещё бонусный вариант: если вы копируете винду с одного физического диска на другой, можно после копирования вынуть из компьютера старый физический диск и загрузиться в новый хотя бы один раз (чтоб винда обновила MountedDevices). Потом можно вставить старый диск обратно. Такой же трюк можно проделать даже с разделами на одном физическом диске: просто временно удалить старый раздел, а потом восстановить его обратно (ясно, что делать это нужно крайне осторожно). Ну и конечно же, всё это не проверялось. :))
И наконец: использовать разные программы для копирования/бекапов разделов (типа Acronis) бесполезно: все они не меняют реестр (скорее всего), поэтому работать в такой ситуации (копирование винды в пределах одного компа) работать не будут.
/boot/grub/grub.cfg
В Windows XP его аналог — это файл boot.ini в корне раздела с Windows, а в Windows 7 — это Windows Boot Manager.
Мощный командный интерпретатор
В стандартном интерпретаторе (то есть в cmd.exe ) есть много разных фич типа ветвления, так же, как и в UNIX'овых интерпретаторах. Там даже есть дебаговый вывод (а-ля set -x ), а именно echo on , правда он включен по дефолту и обычно первым действием в скрипте его отключают ( echo off , разумеется).
Вообще, виндовая команда echo крайне непоследовательна: её действие довольно странным образом зависит от аргумента:
Windows | UNIX |
echo foo | echo foo |
echo on | set -x |
echo off | set +x |
echo | pwd |
После лицезрения этой таблицы все юниксоиды, конечно же, схватились за голову и сказали: «Что за идиоты проектировали винду?» Впрочем, в UNIX'е тоже не всё гладко: с какой стати set -x включает дебаг, а set +x выключает его. То же самое относится к остальным режимам, включаемым командой set .
Рассмотрим операторы перенаправления вывода Bash и похожие по функции операторы и конструкции. Я собрал следующий список, если что-то пропустил, то пишите в комментариях:
- |
- >
- > /dev/null
- >>
- 2>
- 2>&1
- &>
- &>>
- <
- <<
- <<<
- Почему << (here document) и <<< (here string) нельзя использовать с переменными
- В чём различие << (here document) и <<< (here string)
- <(КОМАНДА)
- >(КОМАНДА)
- < <(КОМАНДА АРГУМЕНТЫ)
- 2> >(КОМАНДА) > /dev/null
- cat > ФАЙЛ <<_EOF_
- cat >> ФАЙЛ <<_EOF_
- cat <<_EOF_ > ФАЙЛ
- cat <<_EOF_ >> ФАЙЛ
Этот оператор на английском называется pipe, и на русском его называют труба или конвейер. Используется очень часто для перенаправления вывода из одной команды в другую, которая может принимать стандартный вывод. Например:
Символ > используется для перенаправления вывода в файл, например:
В этом примере вывод команды ls -l будет записан в файл dir.txt.
То есть оператор | используется когда вывод передаётся в другую команду, а оператор > используется когда вывод записывается в файл.
Ещё один пример использования сразу обоих операторов:
Результат работы этой последовательности команд будет сохранён в файл num.txt.
Если файл не существует, то он будет создан. Если файл существует, то оператор > полностью удалит его содержимое и запишет новым.
> /dev/null
Это частный случай перенаправления, когда всё из стандартного вывода перенаправляется в псевдоустройство /dev/null. Это означает уничтожение данные. То есть ничего не будет выводиться в стандартный вывод.
Функция оператора >> похожа на > с тем отличием, что оператор >> не удаляет содержимое файла, а дописывает новые данные к уже существующим.
Если файл не существует, то оператор >> создаст его и запишет в него переданные данные.
Оператор 2> перенаправляет стандартный вывод ошибок — standard error (stderr).
Результат выполнения команд и возникшие ошибки выводятся на консоль и может показаться, что это одно и то же. Но на самом деле, это разные типы вывода.
К примеру попытаемся сохранить в файл текст ошибки, возникшей в результате выполнения команды:
Текст ошибки будет выведен на экран, но файл ls-error.txt окажется пустым.
В данном случае ошибка не будет выведена на экран, а будет сохранена в файл ls-error.txt.
Файловый дескриптор «2» помещается непосредственно перед оператором перенаправления, чтобы выполнить перенаправление стандартной ошибки в файл ls-error.txt.
Конструкция 2>&1 предназначена для перенаправления стандартного вывода и стандартного вывода ошибок в один файл.
Используя этот метод, мы выполняем два перенаправления. Сначала мы перенаправляем стандартный вывод в файл ls-output.txt, а затем перенаправляем дескриптор файла 2 (стандартная вывод ошибок) на дескриптор файла один (стандартный вывод), используя обозначения 2>&1.
Обратите внимание, что порядок перенаправлений является значимым. Перенаправление стандартной ошибки всегда должно происходить после перенаправления стандартного вывода, иначе оно не работает. В приведённом выше примере
перенаправляет стандартную ошибку в файл ls-output.txt, но при изменении порядка на
стандартная ошибка направлена на экран.
Последние версии bash предоставляют второй, более упрощённый метод для выполнения комбинированного перенаправления 2>&1:
В этом примере мы используем одинарную запись &> для перенаправления как стандартного вывода, так и стандартной ошибки в файл ls-output.txt.
Вы также можете добавить стандартные выходные данные и стандартные потоки ошибок в один файл, например так:
Итак, &> является аналогом 2>&1, а &>> это то же самое, но с перенаправлением вывода в файл.
Как мы уже рассмотрели выше, символ > является перенаправлением вывода. Что касается символа <, то он перенаправляет ввод. Используется следующим образом:
В этом случае КОМАНДА1 будет выполнена с ФАЙЛ1 в качестве источника ввода вместо клавиатуры, которая является обычным источником стандартного ввода.
Оператор < соответствует использованию | для передачи в программу стандартного ввода. Например, следующие команды являются идентичными:
Ещё один пример, содержимое файла math.txt:
Тогда следующие команды идентичны:
Оператор << называется here document. С его помощью можно ввести строку состоящую из нескольких строк или присвоить переменной многострочное значение.
Если в консоль ввести
и нажать Enter, то переменной a будет присвоено значение «строка» и вновь станет доступно приглашение командной строки, потому что Enter по умолчанию является разделителем, символом новой строки. Из-за этого не получится ввести многострочное значение.
Оператор << (here document) меняет это правило — обозначением для новой строки становится другая последовательность символов. В качестве такого обозначения можно выбрать любой набор символов, единственное условие — этот набор не должен встречаться в водимых данных.
Данная запись означает, что запущена команда cat, после неё идёт оператор << и последовательность символов _EOF_. Эти символы (_EOF_) + Enter означают, что _EOF_ - становится обозначением начала и конца для многострочных данных. То есть Enter больше не будет означать окончание ввода данных, в качестве обозначения окончания ввода данных будет выступать _EOF_. Вместо этих символов можно выбрать что угодно.
Второй ввод _EOF_ + Enter означает конец многострочных данных. После этого будет выполнена команда, то есть будут выведены введённые цифры:
Если вы хотите переменной присвоить многострочное значение, то это можно сделать примерно так:
Выведем значение переменной:
Here document это весьма полезная конструкция, к примеру, с её помощью можно делать шаблоны текста, меню, выводимых данных:
Оператор <<< называется here string. Он передаёт с правой стороны стандартный ввод. Чтобы было понятно, следующие команды эквивалентны:
Почему << (here document) и <<< (here string) нельзя использовать с переменными
Если мы захотим присвоить переменной значение с помощью рассмотренных операторов и попробуем выполнить:
то будет получена ошибка:
Причина в том, что нельзя присвоить значение переменным передав данные в стандартном вводе. Например команда
вызовет точно такую же ошибку.
А операторы << (here document) и <<< (here string) передают данные командам в стандартном вводе.
В чём различие << (here document) и <<< (here string)
Различие между этими операторами в том, что << передаёт многострочные данные, которые обрамляются указанной последовательностью символов, а <<< передаёт только строку.
<(КОМАНДА)
Конструкция <(КОМАНДА) называется «подстановка процессов» (Process Substitution). В качестве КОМАНДА может быть одна или более команд с аргументами. Конструкция
вернёт имя специального файла, прочитав который можно получить вывод КОМАНДЫ.
Применение данного способа записи и чтения в и из команды показано далее.
>(КОМАНДА)
Это ещё одна форма «подстановки процессов» (Process Substitution):
Если используется эта форма, то вместо записи в файл, данные будут переданы на ввод для КОМАНДЫ.
< <(КОМАНДА АРГУМЕНТЫ)
Данная конструкция состоит из двух уже рассмотренных ранее элементов языка Bash:
Как мы только что узнали, <(КОМАНДА АРГУМЕНТЫ) возвращает имя файла из которого нужно считывать результат выполнения КОМАНДЫ. А оператор < передаёт ввод с файла (указанного справа от него) команде на стандартный ввод (указанной слева).
Следующие две команды являются аналогами друг друга:
2> >(КОМАНДА) > /dev/null
Эка комбинация, включающая в себя 3 уже рассмотренных элемента:
- 2> означает перенаправление стандартного вывода ошибок (stderr)
- >(КОМАНДА) означает подстановку процессов, в результате стандартный вывод ошибок будет передан для обработки в КОМАНДУ
- > /dev/null означает перенаправления стандартного вывода в /dev/null, то есть фактическое уничтожение стандартного вывода
Пример практического использования:
cat > ФАЙЛ <<_EOF_
Эта конструкция может показаться очень замысловатой, но она состоит из двух уже рассмотренных элементов:
- > (перенаправление вывода в файл)
- << (here document, то есть многострочный ввод)
В результате выполнения этого кода, в ФАЙЛ будут записаны строки
Причём если ФАЙЛ уже существует, то он будет стёрт и заменён указанным содержимым.
То есть это один из способов сохранения в файл многострочного вывода.
cat >> ФАЙЛ <<_EOF_
Эта конструкция похожа на предыдущую, в ней используются
- >> (перенаправление вывода в файл с дописыванием данных)
- << (here document, то есть многострочный ввод)
В результате выполнения следующего кода:
В ФАЙЛ будут сохранены строки:
Причём если ФАЙЛ уже существует, то он будет дописан.
cat <<_EOF_ > ФАЙЛ
Данная конструкция получает многострочный ввод по стандартному вводу и сохраняет его в файл. То есть это аналог
Читайте также: