Аналог 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 тоже есть перенаправления, пайпы, свой /dev, /dev/null, /etc/fstab, grub.cfg

2012-10-30 в 17:41, admin , рубрики: GNU/Linux, windows, Песочница, метки: GNU/Linux, windows

Разделы можно пропускать без ущерба для понимания, ровно как и любые непонятные/неинтересные места в них

Перенаправления

Да, в 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_ > ФАЙЛ

Данная конструкция получает многострочный ввод по стандартному вводу и сохраняет его в файл. То есть это аналог

Читайте также: