除了使用临时文件来提供帮助之外,是否有一种方法/程序可以缓冲输入,stdin但在获取EOF. 我也不想使用 shell 变量(例如buffer=$(cat))。
该程序应如下所示(假设程序名称为buffered-cat):
$ buffered-cat
line 1
line 2
line 3
^D # Ctr-D here(End of Line)
Run Code Online (Sandbox Code Playgroud)
现在程序收到了^D,buffered-cat输出内容
line 1
line 2
line 3
Run Code Online (Sandbox Code Playgroud) 我给了一个问题的答案,并评论它,让我阅读的基本定义的POSIX一致性部分弄清楚是否/dev/stdin,/dev/stdout而/dev/stderr实际上需要符合POSIX标准。
事实证明他们不是:
系统可能提供非标准扩展。这些是 POSIX.1-2008 不需要的功能,可能包括但不限于: [...] 具有特殊属性的附加字符特殊文件(例如
/dev/stdin,/dev/stdout、 和/dev/stderr)
据我所知,这是标准中唯一提到这些文件的地方。
我只能访问一个没有实现它们的“系统”(环境,真的),那就是 Windows 上的 MinGW(/dev就我所见,根本没有)。据我所知,所有免费的 Unices 都有,Cygwin、Windows 的新 Linux 环境和 Darwin/macOS 也有。
不过,我对商业 Unices 并不熟悉。
是否有一个 POSIX 系统、Unix 或某种描述的类 Unix 环境,今天还活着,它没有实现/dev/stdin, /dev/stdout, 和/dev/stderr作为文件系统中的文件?
使用任何一种都可以提供可读的文本。但只有使用 stderr 重定向才能滚动或键入 /somepattern 并获得匹配项。
没有它,搜索会给出“没什么可搜索的(按 RETURN)”和一列 ~ 的。
鉴于,stderr 和 stdout 不一样,但为什么在我开始用 less 做某事之前,为什么 less 显示它们相同?
这可能是我不明白的一些奇怪的多窗口 vim 东西。想法?
我正在尝试编写一个符合 POSIX 标准的脚本,因此它可以在任何 *nix 系统(Debian、Fedora、CentOS、AIX、Arch……所有这些)上运行。说到重定向,我对 POSIX 支持什么和不支持什么感到很困惑。
如果我重定向ls -l file missingfile &> out.txt这在bash. 不存在的stderr抱怨行missingfile和 , 的权限输出file都在out.txt. 但是,我相信这只是有效,因为这些 shell 支持的不仅仅是 POSIX 标准运算符。在研究这个问题时,我遇到了相互矛盾的答案。
这stackexchange答案,例如,似乎在暗示&>,>&,>>&和&>>是非标准操作。但是,此答案明确指出some-program > some_file 2>&1符合 POSIX。这是否意味着>&运算符(使用数字表示stderr& stdout)符合 POSIX 而&>用于自动重定向stderr和重定向stdout到文件不符合 POSIX 标准?或者都是&>和>&不符合POSIX / POSIX兼容的(这两人一个是错的)?
我考虑过完全避免使用该&标志并使用,ls -l …
可能重复:
IO 重定向和 head 命令
我只想删除文件的第一行以外的所有内容。我这样做了:
head -1 foo.txt
Run Code Online (Sandbox Code Playgroud)
...并确认我只看到了第一行。然后我做了:
head -1 foo.txt > foo.txt
Run Code Online (Sandbox Code Playgroud)
但不是只包含第一行,foo.txt现在是空的。
事实证明,这cat foo.txt > foo.txt也清空了文件。
为什么?
最近,我一直在试验这个ps命令,有时长路径会绕到下一行(或两行)并使其难以阅读。我想将ps输出通过管道传输到另一个程序以将输出限制x为字符数。
这是我到目前为止所拥有的,但它并不完全正确:
ps aux | cut -c1-$(stty size | cut -d' ' -f2)
Run Code Online (Sandbox Code Playgroud)
$(stty size | cut -d' ' -f2)计算结果为 167,但似乎不是cut.
有没有办法让这种类型的语法在 bash 中工作?
我刚开始学习Linux 上的一切都是文件TM,这让我想知道如果我真的从 /dev/stdout 读取会发生什么:
$ cat /dev/stdout
^C
$ tail /dev/stdout
^C
Run Code Online (Sandbox Code Playgroud)
(这^C是我在程序挂起后杀死程序)。
当我尝试使用 时vim,我收到了不可思议的消息:“/dev/stdout”不是文件。喘气!
那么,当我尝试阅读这些“文件”时,为什么会出现挂断或错误消息?
我想将命令的 stderr 流保存到日志文件中,但我也想在屏幕上显示整个输出 (stdout + stderr)。我怎样才能做到这一点?
我只找到了将 stdout + stderr 显示到控制台并将两个流重定向到文件的解决方案:
foo | tee output.file
Run Code Online (Sandbox Code Playgroud)
但我只想将 stderr 重定向到日志文件。
我使用 Ubuntu 服务器 16.04,并且我希望at在当前会话中使用该实用程序在 1 分钟后执行某些操作(例如echo),而不提供特定日期和时间 - 仅比当前时间提前 1 分钟。
这失败了:
echo 'hi' | at 1m
Run Code Online (Sandbox Code Playgroud)
我选择的原因at了sleep,因为睡眠障碍当前会话是延迟命令为此更适合在另一个会话,而不是大部分时间的一个,我们的工作。AFAIR,at不会以这种方式行事,也不会妨碍我的会议。
根据 Pied Piper 的回答,我尝试过:
(sleep 1m; echo 'hi') &
Run Code Online (Sandbox Code Playgroud)
我对这种方法有一个问题:“hi”流打印在我的主提示中,并且还在_包含它的主提示下添加了一个空的辅助提示 ( ),请参阅:
USER@:~# (sleep 1m; echo 'hi') &
[1] 22731
USER@:~# hi
^C
[1]+ Done
Run Code Online (Sandbox Code Playgroud)
通过 Peter Corde 的回答,我尝试过:
(sleep 2 && echo -e '\nhi' && kill -WINCH $$ &)
Run Code Online (Sandbox Code Playgroud)
这在 Bash 4.4 中可以正常工作,但在某些旧版本中似乎无法正常工作(请参阅答案中的评论)。我个人在自己的环境中使用 Bash 4.3。
我有一个 systemd 服务:
[Unit]
Description=My application
[Service]
ExecStart=/bin/java myapp.jar
Type=simple
User=photo
Run Code Online (Sandbox Code Playgroud)
有一个选项:StandardOutput=但我不明白如何使用它来写入文件。 https://www.freedesktop.org/software/systemd/man/systemd.exec.html
我希望将文件路径放在这里,但文档讨论了套接字和文件描述符。似乎它需要的配置不仅仅是那个关键字。
把文件路径放在哪里? 我找不到任何这种用途的例子
谢谢