有人可以澄清差异吗?其中一些被认为是最佳实践吗?如果我没记错的话,我以某种方式在 SO 上读到这1>/dev/null应该在此之前:2>&1
ls -al /doesNotExists 2>&1 1>/dev/null
ls -al /doesNotExists 1>/dev/null 2>&1
ls -al /doesNotExists 1>&2 2>/dev/null
ls -al /doesNotExists 2>/dev/null 1>&2
ls -la /doesNotExists 2<&1 1>/dev/null
ls -la /doesNotExists 2<&1 2>/dev/null
ls -la /doesNotExists 1<&2 1>/dev/null
ls -la /doesNotExists 1<&2 2>/dev/null
ls -la /doesNotExists 1>/dev/null 2<&1
ls -la /doesNotExists 2>/dev/null 2<&1
ls -la /doesNotExists 1>/dev/null 1<&2
ls -la /doesNotExists 2>/dev/null 1<&2
Run Code Online (Sandbox Code Playgroud) ./script &>> log.txt
我得到了一个不错的日志文件,但是如果我有由 cron 执行的相同命令,那么可以说 crontab 看起来像这样:
* * * * * '/home/user/script &>> /home/user/log.txt'
Run Code Online (Sandbox Code Playgroud)
log.txt 将是空的,我试过 " 和 ' 和 ` 并且没有刻度来包含命令,知道为什么流不会被写入文件吗?
一些程序直接在stdout. 这里有些例子:
tar -c file.png
dd if=file.png
Run Code Online (Sandbox Code Playgroud)
嗯,我看到输出可以重定向到一个文件。但是这些程序已经接受输出文件名作为参数。因此,以下命令将给出相同的结果:
tar -c file.png > file.tar
tar -c file.png -f file.tar
dd if=file.png > copy.png
dd if=file.png of=copy.png
Run Code Online (Sandbox Code Playgroud)
二进制输出stdout可以用于什么其他目的?
在 OSX TextMate 上有别名mate,您可以将其与管道一起使用以打开其他程序的标准输出。
如何使用 Notepad++ 在 Windows 7 中实现相同的效果?
前任。: git diff master|edit
我正在尝试执行以下命令: find 。-名称“ .[ch] ”| xargs grep -in 模式 > 文件
由于未找到一些文件,stderr 上打印了一些错误。如何在同一命令中将 stdout 重定向到文件并将 stderr 重定向到 /dev/null/ ?
该命令不起作用: find 。-名称“ .[ch] ”| xargs grep -in 模式 1> 文件 2> /dev/null/
错误信息:ksh: /dev/null/: 无法创建[是目录]
谁能告诉我该怎么做?
干杯,VSN
我正在尝试使用 FFMPEG 将 avi 文件转码为 mp4 并使用以下命令将数据通过管道传输到标准输出(技术上通过 NodeJS,但在命令行上直接执行以下命令时我收到相同的错误):
ffmpeg -i myavi.avi -vcodec libx264 -acodec libvo_aacenc -f mp4 pipe:1
Run Code Online (Sandbox Code Playgroud)
会出现这个错误:
Could not write header for output file #0 (incorrect codec parameters ?): Error number -22 occurred.
Run Code Online (Sandbox Code Playgroud)
当我执行下一个命令时,一切都按预期工作:
ffmpeg -i myavi.avi -vcodec libx264 -acodec libvo_aacenc -f mp4 newmp4.mp4
Run Code Online (Sandbox Code Playgroud)
请注意,我在 Windows 上使用(或尝试)FFMPEG——对这里发生的事情有什么想法吗?
编辑:最后一个说明,我使用的 FFMPEG 版本是 N-63439-g96470ca,构建于 2014 年 5 月 25 日(最新版本的 FFMPEG 可用于http://ffmpeg.zeranoe.com/上的 Windows 静态文件)构建/)。
ssh me@server "echo this ran remotely"
Run Code Online (Sandbox Code Playgroud)
输出this ran remotely被置于标准输出。太棒了。
echo "echo this ran remotely" > test.cmd
putty -i privatekey.ppk -m test.cmd -ssh me@server
Run Code Online (Sandbox Code Playgroud)
输出不会进入标准输出,而是在新进程中打开,据我所知,它会永远丢失。
如何捕获远程命令的输出?
我知道我可以在 cygwin 中执行此操作,但这没有帮助,因为很难从其他脚本语言以编程方式运行 cygwin 命令。
要么我在做一些愚蠢的事情,要么 Sun 是。怎么会像这样:
java -version > version.txt
Run Code Online (Sandbox Code Playgroud)
仍然打印到标准输出并将 version.txt 留空?我正在检查退出代码,它仍然是 0,所以这不是写入 stderr。
我需要这个,因为我正在构建一个测试环境工具并想检查 Java 的版本是否足够,我计划捕捉该版本的输出,但现在我被卡住了。
我使用的是 OS X Leopard,Java 版本 1.6.0_20。
有任何想法吗?
如果要过滤文件,但如果我使用相同的文件作为输入和输出,则输出文件为空。是否有另一种解决方案而不是使用第二个文件?
php -r "echo preg_replace('~/\* DEV \*/(.*)/\* ENDDEV \*/~si', '', file_get_contents('php://stdin'));" < build/index.php > build/index.php
Run Code Online (Sandbox Code Playgroud) 我尝试过rse将标准输出和标准错误流与程序区分开来;但我真的很喜欢在单独的终端中查看两者的选项,而无需重定向到文件并拖尾它或其他东西(假设任一流都可以打印 ANSI 终端控制代码。)
有没有办法在新终端或类似的东西中打开现有进程的标准错误?
我的程序输出到stderr和stdout。我想在stderr和 中搜索“模式” stdout。我希望将其余部分发送到/dev/null.
如果我在重定向后使用管道stderr:./prog 2>/dev/null | grep "pattern"
我没有得到stderr包含“模式”的行。
如果我在重定向之前使用管道stderr:./prog | grep "pattern" 2>/dev/null
没有一个stderr被重定向到/dev/null
感谢您的帮助。