标签: stdout

一个可以缓冲标准输入或文件的程序

除了使用临时文件来提供帮助之外,是否有一种方法/程序可以缓冲输入,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)

现在程序收到了^Dbuffered-cat输出内容

line 1
line 2
line 3
Run Code Online (Sandbox Code Playgroud)

shell buffer stdout

14
推荐指数
3
解决办法
2170
查看次数

没有 /dev/stdin、/dev/stdout 和 /dev/stderr 的 Unix 系统?

我给了一个问题的答案,并评论它,让我阅读的基本定义的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作为文件系统中的文件?

posix stdout stdin stderr

14
推荐指数
1
解决办法
2501
查看次数

`docker 记录 foo | less` 不可搜索或滚动,但 `docker logs foo 2>&1 | 少是

使用任何一种都可以提供可读的文本。但只有使用 stderr 重定向才能滚动或键入 /somepattern 并获得匹配项。

没有它,搜索会给出“没什么可搜索的(按 RETURN)”和一列 ~ 的。

鉴于,stderr 和 stdout 不一样,但为什么在我开始用 less 做某事之前,为什么 less 显示它们相同?

这可能是我不明白的一些奇怪的多窗口 vim 东西。想法?

less pipe stdout stderr

13
推荐指数
1
解决办法
4214
查看次数

将标准输出和标准错误重定向到文件的符合 POSIX 的方法

我正在尝试编写一个符合 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 …

shell io-redirection posix stdout stderr

13
推荐指数
1
解决办法
2809
查看次数

为什么将文件“cat”到自身中会擦除它?

可能重复:
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也清空了文件。

为什么?

cat head stdout

12
推荐指数
1
解决办法
8646
查看次数

在 Bash 中动态修剪标准输出线宽

最近,我一直在试验这个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 中工作?

shell bash cut stdout

12
推荐指数
2
解决办法
7974
查看次数

为什么我不能用文本编辑器读取 /dev/stdout?

我刚开始学习Linux 上的一切都是文件TM,这让我想知道如果我真的从 /dev/stdout 读取会发生什么:

$ cat /dev/stdout 
^C
$ tail /dev/stdout 
^C
Run Code Online (Sandbox Code Playgroud)

(这^C是我在程序挂起后杀死程序)。

当我尝试使用 时vim,我收到了不可思议的消息:“/dev/stdout”不是文件。喘气!

那么,当我尝试阅读这些“文件”时,为什么会出现挂断或错误消息?

linux files stdout

12
推荐指数
2
解决办法
2万
查看次数

bash:将 stderr 重定向到文件并将 stdout + stderr 重定向到屏幕

我想将命令的 stderr 流保存到日志文件中,但我也想在屏幕上显示整个输出 (stdout + stderr)。我怎样才能做到这一点?

我只找到了将 stdout + stderr 显示到控制台并将两个流重定向到文件的解决方案:

 foo | tee output.file
Run Code Online (Sandbox Code Playgroud)

/sf/ask/29322751/

但我只想将 stderr 重定向到日志文件。

linux bash pipe io-redirection stdout

12
推荐指数
1
解决办法
2万
查看次数

从现在开始的某个时间做一些事情(也许还可以在控制台中显示结果)

我使用 Ubuntu 服务器 16.04,并且我希望at在当前会话中使用该实用程序在 1 分钟后执行某些操作(例如echo),而不提供特定日期和时间 - 仅比当前时间提前 1 分钟。

这失败了:

echo 'hi' | at 1m
Run Code Online (Sandbox Code Playgroud)

我选择的原因atsleep,因为睡眠障碍当前会话是延迟命令为此更适合在另一个会话,而不是大部分时间的一个,我们的工作。AFAIR,at不会以这种方式行事,也不会妨碍我的会议。

更新_1

根据 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)

更新_2

通过 Peter Corde 的回答,我尝试过:

(sleep 2 && echo -e '\nhi' && kill -WINCH $$ &)
Run Code Online (Sandbox Code Playgroud)

这在 Bash 4.4 中可以正常工作,但在某些旧版本中似乎无法正常工作(请参阅答案中的评论)。我个人在自己的环境中使用 Bash 4.3。

sleep console stdout at delay

12
推荐指数
3
解决办法
1626
查看次数

systemd:如何将标准输出重定向到日志文件

我有一个 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

我希望将文件路径放在这里,但文档讨论了套接字和文件描述符。似乎它需要的配置不仅仅是那个关键字。

把文件路径放在哪里? 我找不到任何这种用途的例子

谢谢

logs systemd services stdout

12
推荐指数
2
解决办法
3万
查看次数

标签 统计

stdout ×10

shell ×3

stderr ×3

bash ×2

io-redirection ×2

linux ×2

pipe ×2

posix ×2

at ×1

buffer ×1

cat ×1

console ×1

cut ×1

delay ×1

files ×1

head ×1

less ×1

logs ×1

services ×1

sleep ×1

stdin ×1

systemd ×1