Is there a /dev/null on Windows?
Asked Answered
M

11

505

What is the equivalent of /dev/null on Windows?

Mages answered 23/11, 2008 at 23:28 Comment(0)
E
582

I think you want NUL, at least within a command prompt or batch files.

For example:

type c:\autoexec.bat > NUL

doesn't create a file.

(I believe the same is true if you try to create a file programmatically, but I haven't tried it.)

In PowerShell, you want $null:

echo 1 > $null
Estrin answered 23/11, 2008 at 23:30 Comment(14)
@Jim: Interesting - I didn't know you could write to paths off /dev/null as if it were a directory. Hmm.Estrin
On Ubuntu: echo blah > /dev/null.txt bash: /dev/null.txt: Permission denied Maybe this is something specific to your system...Taxiplane
@capthive: There's a difference between /dev/null.txt and /dev/null/foo.txt.Estrin
I just looked at this again, and I retract my original statement. I was doing the write in code, and the error was getting swallowed. I'm deleting it so no one accidentally takes it as the truth.Belonging
Wikipedia's /dev/null article also states that PowerShell denotes $null as being acceptable... Trying it just now with wget (part of GnuWin32), it accepted $null as a destination when specified with --output-document=$null. NUL is shorter though so I'll be using that!Pianist
@Marwelln: It's definitely not on Windows 8.0. echo foo > NULL then echo foo > NUL, then dir n* will show NULL but not NUL.Estrin
For people looking for Unix "special" files under Windows: here are /dev/random and /dev/zero device drivers for Win32.Stipendiary
Note that a program, that heavily prints to stdout, will take the same amount of time to finish if redirected to NUL - although there's nothing to print.Habilitate
@CoDEmanX: That's not my experience. Writing to the console - or even a file - can take a significant chunk of time. I've just tested it with a program writing "Hello there" to stdout 10000000 times. Redirecting to a file (on an SSD) took 18 seconds. Redirecting to NUL took 4 seconds. Not redirecting at all made me give up through a lack of patience after a while...Estrin
In my test on Windows 7 with regular HDD, the example program took 0.67s for writing to file, 1.4s for NUL and multiple minutes for printing to console. I guess it varies and there are a couple influencing conditions.Habilitate
You can also use C:\Windows\System32\drivers\null.sys.Slapbang
I've learned back in Win95 times that you should write a colon after special device names, so NUL: (and CON:, PRN:, ...), It is mostly a matter of style and shows clearly that NUL: is a special object and not a file called NUL. Also,it is possible with a special API to make a file called NUL (see one of the answers). I dream that maybe one day, if everybody uses the colon by convention, we will be able to deprecate the dreaded special device names :-)Glycine
I did some quick tests with LinqPad and it looks like NUL is not supported by Windows either as a filename or as a path element. My guess is that NUL is a cmd.exe thing only (hence PowerShell needing $null instead).Smoothie
cat foobar 2> $null redirects stderr to null.Toback
E
68

NUL in Windows seems to be actually a virtual path in any folder. Just like .., . in any filesystem.

Use any folder followed with NUL will work.

Example,

echo 1 > nul
echo 1 > c:\nul
echo 1 > c:\users\nul
echo 1 > c:\windows\nul

have the same effect as /dev/null on Linux.

This was tested on Windows 7, 64 bit.

Early answered 5/1, 2015 at 4:56 Comment(6)
Nice, it's not possible to create a file named "nul" on Windows 7 64bit :)Douai
@DawidFerenczy it's possible, although not in the classic way. E.g. md \\.\c:\nul quora.com/…, gohacking.com/how-to-create-con-folder-in-windows, superuser.com/questions/86999/…Coquetry
On Windows 10 in bash, the first one creates a file nulExtensometer
throws IOException using java in win10. Just need to wrap it on try catch. Was hoping to be no exception/errors just like /dev/nullHahn
@Extensometer Maybe in Bash, but it didn't create a file when I ran it in Command Prompt.Rakehell
Following on from the above - Git Bash on Windows 10 does indeed create a file called nul if you run echo '1' > nul.Rakehell
E
64

According to this message on the GCC mailing list, you can use the file "nul" instead of /dev/null:

#include <stdio.h>

int main ()
{
    FILE* outfile = fopen ("/dev/null", "w");
    if (outfile == NULL)
    {
        fputs ("could not open '/dev/null'", stderr);
    }
    outfile = fopen ("nul", "w");
    if (outfile == NULL)
    {
        fputs ("could not open 'nul'", stderr);
    }

    return 0;
}

(Credits to Danny for this code; copy-pasted from his message.)

You can also use this special "nul" file through redirection.

Extricate answered 23/11, 2008 at 23:32 Comment(1)
Ah, so this explains why, if you create a C:\dev directory in Windows, and you use a lot of GNU utilities, you'll eventually acquire a mysterious file called null in that directory.Bizarre
O
37

Jon Skeet is correct. Here is the Nul Device Driver page in the Windows Embedded documentation (I have no idea why it's not somewhere else...).

Here is another:

Orphaorphan answered 24/11, 2008 at 1:31 Comment(2)
Of course Jon Skeet is correct. Thank you for stating an obvious and universal truth :)Shoreless
2 of the links here are now broken. :(Aldercy
A
23

NUL works programmatically as well. E.g. the following:

freopen("NUL", "w", stderr);

works as expected without creating a file. (MSVC++ 12.0)

Aletheaalethia answered 24/5, 2017 at 16:29 Comment(2)
There are only so many times the question needs to be answered with NUL, and it was past that point 5 years ago.Yugoslav
I think this answer adds a valid contribution to the discussion.Wie
S
21

If you need to perform in Microsoft Windows the equivalent of a symlink to /dev/null in Linux you would open and administrator's cmd and type:

For files:

mklink c:\path\to\file.ext NUL:

Or, for directories:

mklink /D c:\path\to\dir NUL:

This will keep the file/direcotry always at 0 byte, and still return success to every write attempt.

Spangle answered 2/6, 2018 at 0:3 Comment(0)
I
3

In Windows10, if you want to use NUL like a file e.g.

robocopy .\test NUL /move /minage:30 
# delete all files older than 30 days using robocopy

These answers all don't work.

You get the error:

ERROR 123 (0x0000007B) Accessing Destination Directory \\.\NUL\
The filename, directory name, or volume label syntax is incorrect.

However, it works if you do in cmd.exe:

echo 1 > NUL

So NUL doesn't behave exactly like a /dev/null file.

However, for the robocopy command, you can do something like:

robocopy .\test NUL\null /move /minage:30 

Then it works!

In Powershell, the $null works only as stdout redirection

echo 1 > $null

But you can't use $null in a command like for robocopy instead of a file. Neither does $null\null work.

So all I could find to have the same effect like cmd.exe in PowerShell, is to call cmd.exe from within PowerShell like this:

mkdir test1
cd test1
echo "" > test1.txt
echo "" > test2.txt
echo "" > test3.txt

$path = '.\test1'
cmd.exe /c "robocopy $path NUL\null /move"

# also this works:
cmd.exe /c "robocopy $path .\NUL\null /move"

So NUL doesn't behave exactly like /dev/null folder but like a folder which can have phantom files inside it when used as a target file except you use it with > redirection, then it behaves as it is like a null device/file.

In addition it is to be mentioned that cmd.exe creates a NUL when first used. But one cannot look into it.

Irritate answered 12/5, 2022 at 7:31 Comment(3)
Doing the above with robocopy will actually create a folder called NUL, which isn't really what is desired here, especially since the folder then can't be deleted using normal means (e.g. Windows Explorer).Anele
@Anele Thank you for the remark! Perhaps there is no real equivalent to Linux's /dev/null, unfortunately.Irritate
If only I read the comments before trying the Robocopy part of this answer... now to figure out how to delete this folder and its contents!Griffey
C
0

Null-Redirecting streams in PowerShell:

These example assumes mySum is the name of your application and 5 10 are the arguments you're sending.

& .\mySum 5 10 >$null 2>&1

& is PowerShell's Call operator. Starting a process that isn't on your PATH environment variable requires you provide a file path of some sort, which is why mySum is prepended with .\ to make it a relative path.

Redirecting to $null is the PowerShell analog to using /dev/null on Unix-based platforms. 2>&1 at the end will redirect StdErr to StdOut, which will all go to $null.

You could also use the Start-Process function:

Start-Process .\mySum -ArgumentList (5,10) -NoNewWindow -Wait >$null 2>&1

This will start a detached process. -ArgumentList accepts an argument or a collection of arguments (note the comma). The parentheses aren't necessary here, but it makes it more obvious that a list is being provided. -NoNewWindow prevents Start-Process from opening a new terminal window if the program you are running outputs to the console. -Wait will wait for the process to close before continuing.

This can be shortened using built-in function & parameter aliases:

saps .\mySum 5,10 -nnw -Wait >$null 2>&1

saps & start are the aliases for Start-Process, but saps is used here because it's slightly shorter. -ArgumentList is implied as a positional parameter, but if you'd rather not do that, you could instead use the parameter alias -Args. I also excluded the clarity-providing parentheses since they're not required. Lastly, -nnw is the alias for -NoNewWindow.

Celka answered 2/12, 2017 at 0:26 Comment(0)
N
0

The only built-in tool, which can deal with NUL is the good old copy. But make sure, you use the switch /b (binary), otherwise the content won't be cached by OS (that was my goal).

Put a directory (recursive) to OS cache:

for /f "delims=" %f in ('dir /s /b /a-d D:\Solr\data') do @copy /b "%f" nul > nul

Use the RamMap (from Sysinternals) to verify.

Nevile answered 1/12, 2022 at 8:14 Comment(1)
The question: "What is the equivalent of /dev/null on Windows?" This is not an answer to Q. Also: "The only built-in tool"? The NUL "file device" works on much more than just the MS COPY command. Maybe I misunderstood you? If I did, so did others..Sluggish
S
0

The device you are looking for is nul.

HOWEVER, if you don't want to see any output and send 'everything', i.e. stdout and stderr, both to nul (to nowhere) you need to redirect stderr to nul too. This is done appending >nul 2>&1 at the end of the line whose output you want to hide.

For example, if you want to kill a process called EvilApp anyway and are not interested in seen the output of kill opperation, you may write something like this in your batch file for Windows:

@taskkill /F /IM EvilApp.exe >nul 2>&1

After that, EvelApp is killed if running. You do not see any output for this, either on console (cmd) nor as file somewhere. You will also not see an error message in the case that EvilApp was not alive at all.

I hope this help.

Superload answered 19/6, 2023 at 11:28 Comment(0)
P
0

For apps such as MSVC, I do not believe there is a way to send the object to the null device. I would have thought using /Fo\\.\NUL and not /FoNUL to specify the null device would work, but it does not. According to https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file, this should be the right way to send output to the null device, however,

cl /c file.cpp /Fo\\.\NUL            # does not work

thus, the best one can do is use /Fo\path\to\tmp.obj and then delete the object file.

Parahydrogen answered 13/2 at 13:29 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.