升级到新发布版本后,我的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) 我只想快速浏览一下我分离的 GNUscreen会话。是否可以将当前内容转储到 stdout ?就像是
screen --print SESSION_NAME > file.txt
Run Code Online (Sandbox Code Playgroud) 我有一个正在运行的进程,它将标准输出和标准错误写入日志文件/var/log/dragonturtle.log。无论如何要轮换日志文件,并让进程继续写入新的日志文件而不终止进程?
当前发生了什么(鉴于下面的 logrotate 配置):
/var/log/dragonturtle.log/var/log/dragonturtle.log到/var/log/dragonturtle.log.1/var/log/dragonturtle.log.1我想发生什么:
/var/log/dragonturtle.log/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) 我不明白管道中的数据是如何流动的,希望有人能澄清那里发生了什么。
我认为命令管道以逐行方式处理文件(文本、字符串数组)。(如果每个命令本身逐行工作。)每行文本都通过管道,命令不会等待前一个完成处理整个输入。
但似乎并非如此。
这是一个测试示例。有几行文字。我将它们大写并重复每行两次。我这样做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)
应该是这样吗?为什么不是一行一行的?
我想将标准输出从一个进程发送到另一个进程的标准输入,但也发送到控制台。例如,将 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) 我有两个正在运行的进程实例。其中之一是“吓坏了!” 和打印错误不停地到标准输出。
我想终止损坏的进程,但我必须确保我不会终止错误的进程。它们几乎是同时启动的,使用top我可以看到它们使用的内存和 CPU 量大致相同。我似乎找不到任何表明哪个进程表现不佳的内容。
最安全的做法是找出哪个进程/pid 正在写入 STDOUT。
有没有办法做到这一点?
也许之前已经回答过这个问题,我欢迎提供另一个答案的链接......
如果我执行如下的 shell 命令(在bashshell 中):
make
然后,当输出make是通过从滚动STDOUT的的make命令,如果我输入make check并按enter之前的第一个命令执行完毕,当make命令终于完成下一个命令make check将选择权并运行。
我的问题很简单:
有没有办法通过变量重定向 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,只能从脚本中的某些命令重定向。
在vim我可以从我正在查看的文件到另一个文件中写入一系列行。例如,
:1,10 w outfile.txt
Run Code Online (Sandbox Code Playgroud)
将第 1 到 10 行写入 outfile.txt。
我可以在使用 浏览文件时做同样的事情less吗?
我正在尝试比较两个命令输出(无文件)
vimdiff "$(tail /tmp/cachain.pem)" "$(tail /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem)"
Run Code Online (Sandbox Code Playgroud)
我尝试玩重定向,管道,vim - -c但我一定错过了一些东西。有人可以帮忙吗?