我正在编写一个 C 程序,输出stdout到stderr. 该程序采用如下命令:
./myprogram function_to_run file_to_read
Run Code Online (Sandbox Code Playgroud)
我的程序可以输出到stdout或被定向到输出一个文件,但它不能被重定向到/dev/null. 例如:
./myprogram function_to_run file_to_read //OK
./myprogram function_to_run file_to_read > file.txt //OK
./myprogram function_to_run file_to_read > /dev/null // NOT OK, should produce error in stderr
Run Code Online (Sandbox Code Playgroud)
我尝试使用isatty(1),但它只能检测是否stdout正在输出到终端。因此,它在stdout重定向到文件的情况下失败,这在我的情况下是可以接受的
有没有办法在 C 中检查这个?如果没有,我有什么建议可以检查 /dev/null 场景吗?
我的Python脚本通过os.system调用shell命令:
os.system('sudo ifdown wlan0 &> /dev/null')
Run Code Online (Sandbox Code Playgroud)
如果我在没有Python的情况下运行此命令,则在Python中输出被抑制,但是,它仍会打印输出.
我究竟做错了什么?
我正在尝试想出一种方法脚本来在 bash 中传递一个无声标志,以便所有输出都将被定向到/dev/null它是否存在,如果它不存在则定向到屏幕。
我的脚本的 MWE 将是:
#!/bin/bash
# Check if silent flag is on.
if [ $2 = "-s" ]; then
echo "Silent mode."
# Non-working line.
out_var = "to screen"
else
echo $1
# Non-working line.
out_var = "/dev/null"
fi
command1 > out_var
command2 > out_var
echo "End."
Run Code Online (Sandbox Code Playgroud)
我用两个变量调用脚本,第一个是不相关的,第二个 ( $2) 是实际的静默标志( -s):
./myscript.sh first_variable -s
Run Code Online (Sandbox Code Playgroud)
显然,out_var行不工作,但他们给我想要的东西的想法:以直销的方式输出command1,并command2在屏幕或来/dev/null根据-s存在与否。
我怎么能这样做?
如果 ICMP 回显失败,我想忽略此 IF 语句中的错误。
示例代码:
if ping -q -c 1 -W 1 1.2.3.4 >/dev/null; then
echo -e "PING OK"
else
echo -e "PING NOK"
fi
Run Code Online (Sandbox Code Playgroud)
如果 ping 成功或者您在脚本之外运行命令,它会完美运行,但如果没有响应,则会给出以下输出。
PING 1.2.3.4 (1.2.3.4): 56 data bytes
--- 1.2.3.4 ping statistics ---
1 packets transmitted, 0 packets received, 100.0% packet loss
PING NOK
Run Code Online (Sandbox Code Playgroud)
我已经看到了引用 2>/dev/null 的答案,但这会在输出中显示整个 ping 查询,无论成功与否!2>/dev/null 的示例如下。
PING 1.2.3.4 (1.2.3.4): 56 data bytes
--- 1.2.3.4 ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = …Run Code Online (Sandbox Code Playgroud) Windows 确实有一个空设备的概念,例如此处、此处或此处详细介绍。我能找到的所有示例都是关于重定向流的。
在将脚本从 Linux 移植到 Windows 时,我遇到了一些奇怪的事情:如果nul像文件一样打开,我会写入它,关闭它,重新打开它并读回数据。有时。检查工作目录,我可以看到一个名为 的文件nul正在创建,并且随着我向其中写入数据而不断增长。具有讽刺意味的是,我无法从资源管理器中删除它,只能从命令行中删除它。
如今,Windows 10 附带了 OpenSSH 的本机实现。我想使用一个老技巧:当它查找文件时known_hosts,我想将其指向一个空设备。在 Linux 上,这看起来如下ssh -o UserKnownHostsFile=/dev/null user@host:在 Windows 上,我测试如下ssh -o UserKnownHostsFile=nul user@host:我得到了一个名为nul包含主机的文件。我也尝试过NUL,null结果NULL相同。试图指向\Device\Null或/Device/Null导致ssh抱怨它无法找到/打开这些文件。
如何在 Windows (10) 上正确使用和/或指向空设备?
根据另一个线程的提示,我想分析指针,如果它们的解引用会导致分段错误.想法是编写这样的代码:
bool IsPointerValid( void* pPointer )
{
// when opening "/tmp/hugo" here, it works fine... but not with /dev/null??
int iFD = open( "/dev/null", O_WRONLY );
int iBytesWritten = write( iFD, pPointer, 4 );
close( iFD );
return iBytesWritten > 0;
}
Run Code Online (Sandbox Code Playgroud)
但whatevery我传递到IsPointerValid(..),它返回总是如此-因为iBytesWritten始终4.但是当打开"/tmp/testfile"或者是fifo时,它会像预期的那样工作:传递NULL指针write(..),它返回-1.
这种特殊治疗的原因是"/dev/null"什么?
谢谢,
查理
我想在windows cli中将文件下载为null,仅用于测试目的.
在linux中我使用过
wget http://download.thinkbroadband.com/1GB.zip -O /dev/null
Run Code Online (Sandbox Code Playgroud)
这使我的连接忙了一段时间.
有没有办法在Windows 7的命令提示符或电源shell中执行此操作?
此外,还将接受其他解决方案,以便从互联网产生流量,并将其保存到磁盘.
我使用以下脚本与文件夹进行比较:
if diff "/home/folder1/" "/home/folder2/" &> /dev/null ; then
echo "Files in the two folders are the same"
else
echo "Files in the two folders are NOT the same"
fi
Run Code Online (Sandbox Code Playgroud)
是否有一个简短的方法来解释“&> /dev/null”实际上是做什么的,它是否返回一个布尔值真/假?
我的主要问题是:相反会是什么?我的意思是,假设我希望“if diff”问题是“两个文件夹的内容不一样吗?”
我们有一个linux代码,可以根据http://www.itp.uzh.ch/~dpotter/howto/daemonize上的实现从终端分离.
这是一个代码片段:
....
freopen( "/dev/null", "r", stdin);
freopen( "/dev/null", "w", stdout);
freopen( "/dev/null", "w", stderr);
kill( parent, SIGUSR1 );
}
Run Code Online (Sandbox Code Playgroud)
我可以通过以下方式关闭标准文件描述符,而不是重定向到/ dev/null,并获得相同的结果:
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
Run Code Online (Sandbox Code Playgroud)
现在,我对使用什么方法有点困惑:重定向还是关闭?每种方法的潜在问题是什么?
我/dev/null在bash编程中使用了很多东西将不必要的输出发送到黑洞.
例如,这个命令:
$ echo 'foo bar' > /dev/null
$
Run Code Online (Sandbox Code Playgroud)
echo什么都不会.我读过这/dev/null是一个空文件,用于通过重定向处理不需要的输出.但这种处置究竟是如何进行的?我无法想象/dev/null将内容写入文件然后立即删除该文件.那么当你重定向到这个文件时会发生什么?
我想fprintf通过将目标文件重定向到来禁止某些调用/dev/null.但我能确定,fopen("/dev/null", "w");永远不会回来NULL.换句话说,是否每次都可以打开这个"文件"?
如果是这样,我可以使用这个漂亮的三元运算符:
FILE *whereToPrint = (strcmp(custom_topic, ERROR_TOPIC) == 0) ? fopen("/dev/null", "w") : stdout;
fprintf(whereToPrint, "Message sent!\n\n");
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用with声明来抑制sys.stdout或sys.stderr单独使用。 我发现了一个不起作用的教程。我正在使用Python 3.6.4并且我认为该教程是Python 2.
我在 SO 上查了一下,发现了一些但应用程序不起作用或不适用于这种情况。
这不适用:Python subprocess supress stdout and stderr
无法使任何with语句起作用:
Suppress stdout / stderr print from Python functions
这适用于 fortran:在 Python 中重定向 FORTRAN(通过 F2PY 调用)输出
from contextlib import contextmanager
@contextmanager
def suppress_console(file=sys.stdout):
with open(os.devnull, "w") as devnull:
old_file = file
file = devnull
try:
yield
finally:
file = old_file
with suppress_console():
print(1, file=sys.stdout)
# 1
Run Code Online (Sandbox Code Playgroud)