标签: stdout

bash: /dev/stderr: 权限被拒绝

升级到新发布版本后,我的bash脚本开始出现错误:

bash: /dev/stderr: Permission denied
Run Code Online (Sandbox Code Playgroud)

在以前的版本中的Bash将在内部承认这些文件的名称(这就是为什么这个问题不是重复这一个),并做正确的事(TM) ,但是,这现在已经不再工作。我该怎么做才能再次成功运行我的脚本?

我曾尝试将运行脚本的用户添加到组中tty,但这没有区别(即使在注销并重新登录后)。

我可以在命令行上毫无问题地重现这个:

$ echo test > /dev/stdout
bash: /dev/stdout: Permission denied
$ echo test > /dev/stderr
bash: /dev/stderr: Permission denied
$ ls -l /dev/stdout /dev/stderr
lrwxrwxrwx 1 root root 15 May 13 02:04 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 May 13 02:04 /dev/stdout -> /proc/self/fd/1
$ ls -lL /dev/stdout /dev/stderr
crw--w---- 1 username tty 136, 1 May 13 05:01 /dev/stderr
crw--w---- 1 …
Run Code Online (Sandbox Code Playgroud)

bash permissions stdout

25
推荐指数
1
解决办法
3万
查看次数

GNU 屏幕:将分离的会话打印到标准输出

我只想快速浏览一下我分离的 GNUscreen会话。是否可以将当前内容转储到 stdout ?就像是

screen --print SESSION_NAME > file.txt
Run Code Online (Sandbox Code Playgroud)

logs gnu-screen stdout

22
推荐指数
3
解决办法
1万
查看次数

在进程仍在运行时轮换日志文件

我有一个正在运行的进程,它将标准输出和标准错误写入日志文件/var/log/dragonturtle.log。无论如何要轮换日志文件,并让进程继续写入新的日志文件而不终止进程?

当前发生了什么(鉴于下面的 logrotate 配置):

  • 进程写入 /var/log/dragonturtle.log
  • Logrotate 移动/var/log/dragonturtle.log/var/log/dragonturtle.log.1
  • 进程继续写入 /var/log/dragonturtle.log.1

我想发生什么:

  • 进程写入 /var/log/dragonturtle.log
  • Logrotate 副本/var/log/dragonturtle.log/var/log/dragonturtle.log.1
  • 对数旋转截断 /var/log/dragonturtle.log
  • 进程继续写入 /var/log/dragonturtle.log

/etc/logrotate.d/dragonturtle

/var/log/dragonturtle.log {
    daily
    missingok
    rotate 7
    compress
    delaycompress
    notifempty
    create 644 dragonturtle dragonturtle
}
Run Code Online (Sandbox Code Playgroud)

logs logrotate stdout

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

管道,数据如何在管道中流动?

我不明白管道中的数据是如何流动的,希望有人能澄清那里发生了什么。

我认为命令管道以逐行方式处理文件(文本、字符串数组)。(如果每个命令本身逐行工作。)每行文本都通过管道,命令不会等待前一个完成处理整个输入。

但似乎并非如此。

这是一个测试示例。有几行文字。我将它们大写并重复每行两次。我这样做cat text | tr '[:lower:]' '[:upper:]' | sed 'p'

为了遵循这个过程,我们可以“交互地”运行它——跳过cat. 管道的每个部分逐行运行:

$ cat | tr '[:lower:]' '[:upper:]'
alkjsd
ALKJSD
sdkj
SDKJ
$ cat | sed 'p'
line1
line1
line1
line 2
line 2
line 2
Run Code Online (Sandbox Code Playgroud)

但是完整的管道确实等待我完成输入,EOF然后才打印结果:

$ cat | tr '[:lower:]' '[:upper:]' | sed 'p'
I am writing...
keep writing...
now ctrl-D
I AM WRITING...
I AM WRITING...
KEEP WRITING...
KEEP WRITING...
NOW CTRL-D
NOW CTRL-D
Run Code Online (Sandbox Code Playgroud)

应该是这样吗?为什么不是一行一行的?

shell pipe text-processing buffer stdout

22
推荐指数
2
解决办法
3134
查看次数

tee 标准输出到标准错误?

我想将标准输出从一个进程发送到另一个进程的标准输入,但也发送到控制台。例如,将 stdout 发送到 stdout+stderr。

例如,我的git edit别名如下:

git status --short | cut -b4- | xargs gvim --remote
Run Code Online (Sandbox Code Playgroud)

我希望将文件名列表发送到屏幕以及xargs.

那么,是否有类似tee的实用程序可以做到这一点?这样我就可以执行以下操作:

git status --short | \
    cut -b4- | almost-but-not-quite-entirely-unlike-tee | \
    xargs gvim --remote
Run Code Online (Sandbox Code Playgroud)

io-redirection tee stdout stdin

21
推荐指数
2
解决办法
4535
查看次数

如何找出正在写入 STDOUT 的进程?

我有两个正在运行的进程实例。其中之一是“吓坏了!” 和打印错误不停地到标准输出。

我想终止损坏的进程,但我必须确保我不会终止错误的进程。它们几乎是同时启动的,使用top我可以看到它们使用的内存和 CPU 量大致相同。我似乎找不到任何表明哪个进程表现不佳的内容。

最安全的做法是找出哪个进程/pid 正在写入 STDOUT。

有没有办法做到这一点?

process debugging open-files trace stdout

21
推荐指数
2
解决办法
4755
查看次数

在前一个命令写入 STDOUT 时,在 STDIN 中键入另一个命令是否安全?

也许之前已经回答过这个问题,我欢迎提供另一个答案的链接......

如果我执行如下的 shell 命令(在bashshell 中):

make

然后,当输出make是通过从滚动STDOUT的的make命令,如果我输入make check并按enter之前的第一个命令执行完毕,当make命令终于完成下一个命令make check将选择权并运行。

我的问题很简单:

  1. 这样做危险吗?
  2. 这种匆忙打字是否有任何潜在的意外行为?
  3. 为什么它的工作方式如此?

shell bash stdout stdin

21
推荐指数
3
解决办法
1564
查看次数

bash:使用变量存储 stderr|stdout 重定向

有没有办法通过变量重定向 stdout 和 stderr,比如在脚本中添加命令选项?

例如我有一个脚本:

#!/bin/bash -x
TEST=">/dev/null 2>&1"
OPT='-p -v'
mkdir $OPT 123/123/123 $TEST
Run Code Online (Sandbox Code Playgroud)

我可以看到 OPT 被替换为-p没有任何问题,bash 将其解释为选项。但重定向解释为目录名称。

$ ./test.sh 
+ TEST='>/dev/null 2>&1'
+ OPT='-p -v'
+ mkdir -p -v 123/123/123 '>/dev/null' '2>&1'
mkdir: created directory `123/123'
mkdir: created directory `123/123/123'
mkdir: created directory `>/dev'
mkdir: created directory `>/dev/null'
mkdir: created directory `2>&1'
Run Code Online (Sandbox Code Playgroud)

有什么办法可以说 bash,$VAR 是重定向,而不是目录名称。

附注。可能是我走错了路,但我想从我的脚本中制作可选的详细或非详细输出。但是即使在非详细模式下我也需要一些输出,因此我不能只重定向整个 stdout 和 stderr,只能从脚本中的某些命令重定向。

bash io-redirection brace-expansion stdout

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

将行从less写入文件

vim我可以从我正在查看的文件到另一个文件中写入一系列行。例如,

:1,10 w outfile.txt
Run Code Online (Sandbox Code Playgroud)

将第 1 到 10 行写入 outfile.txt。

我可以在使用 浏览文件时做同样的事情less吗?

less stdout

20
推荐指数
1
解决办法
2545
查看次数

vimdiff 比较输出而不是文件

我正在尝试比较两个命令输出(无文件)

vimdiff "$(tail /tmp/cachain.pem)" "$(tail /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem)"
Run Code Online (Sandbox Code Playgroud)

我尝试玩重定向,管道,vim - -c但我一定错过了一些东西。有人可以帮忙吗?

vim stdout stdin vimdiff

19
推荐指数
1
解决办法
6636
查看次数