我似乎记得一些命令或环境变量告诉你这一点。例如,我基本上想要在终端上执行的东西,给你
echo $STDIN
/dev/tty
echo $STDOUT
/dev/tty
fdescribe 0 or fdescribe /dev/stdin
/dev/tty
fdescribe 1 or fdescribe /dev/stdout
/dev/tty
但可以在脚本或子进程中执行
我似乎记得一些命令或环境变量告诉你这一点。例如,我基本上想要在终端上执行的东西,给你
echo $STDIN
/dev/tty
echo $STDOUT
/dev/tty
fdescribe 0 or fdescribe /dev/stdin
/dev/tty
fdescribe 1 or fdescribe /dev/stdout
/dev/tty
但可以在脚本或子进程中执行
这仍然与我昨天的线程有关,所以有警报或者它只是显示在我的终端上的日志/dev/tty1
。当然这很烦人,因为它显示在我的 bash 提示符中,所以每当我想输入一些东西时,我的输入都会被该输出覆盖。它可能会定期打印出来3 second
。所以你可以看到它有多烦人
我的终端看起来像这样:
root@LFS:# echo "Hey get out of there"clocksource: timekeeping watchdog on CPU0: acpi_pm wd-wd readback delay of 643744ns
clocksource: wd-tsc-wd read-back delay of 182144ns, clock-skew test skipped!
clocksource: timekeeping watchdog on CPU0: acpi_pm wd-wd readback delay of 643744ns
clocksource: wd-tsc-wd read-back delay of 182144ns, clock-skew test skipped!
clocksource: timekeeping watchdog on CPU0: acpi_pm wd-wd readback delay of 643744ns
clocksource: wd-tsc-wd read-back delay of 182144ns, clock-skew test skipped!
...
我怀疑这不是因为clocksource
,而是因为dmesg
输出。因为当我指挥dmesg
. 它显示相同。但是,每当我使用/dev/pts
没有烦人的输出或定期发出警报时,我都会在我的 LFS 系统中登录 SSH 时对其进行测试。
那么如何防止dmesg日志显示到/dev/tty1
更新:内部/proc/cmdline
root@LFS:~# cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-5.16.9-lfs-11.1 root=/dev/sda1 ro
这个问题是关于将 wss:// 流保存到多个文件中......在执行时(不是之后)
例子 :
websocat "wss://stream.binance.com:9443/ws/btcusdt@depth" > /path/$(date +%s).txt
此命令每秒接收 TONS 的新行 ....
此命令使用 unix 时间戳中的日期创建一个文件,但将继续保存在同一个文件中,直到我 ctrl+c .....
我不想膨胀成 1 个超大文件....我希望保存标准输出(在多个文件中)
例子
1652209720.txt 将有 30 行
1652209721.txt 将有 10 行
ETC
我试图创建一个.sh,while command do ....
但我在shell中收到stdout而不是新文件......
我怎样才能做到这一点 ?
注意:我知道更多 bash 脚本的 php... 编辑完整的 .sh ------
#!/bin/bash
而 websocat "wss://stream.binance.com:9443/ws/btcusdt@depth" 确实读取 line echo $line >> /Users/jinto/Downloads/d/$(date +%s).stub done
设想:
$ echo "Hello World" > /dev/stderr
Hello World
$ echo "Hello World" > /dev/stdout
$ uname -a
CYGWIN_NT-10.0 xxx 3.3.4(0.341/5/3) 2022-01-31 19:35 x86_64 Cygwin
为什么echo "Hello World" > /dev/stdout
什么都不打印?如何解决问题?
UPD。
echo "Hello World"
打印正常吗?
是的:
$ echo "Hello World"
Hello World
如果没有,你是否
exec >/dev/null
在 shell 中调用或类似的?
不。
UPD2。找到它停止工作的地方:
$ clang t554.c -std=c11 -pedantic -Wall -Wextra -c -S -O3 -o /dev/stdout
.text
<asm code>
# "exxxtern" was a typo
$ clang t554.c -std=c11 -pedantic -Wall -Wextra -c -S -O3 -o /dev/stdout
t554.c:6:3: error: use of undeclared identifier 'exxxtern'
exxxtern int xxx;
^
1 error generated.
TASKING+pavel.morozkin@SPBPC023 ~
$ clang t554.c -std=c11 -pedantic -Wall -Wextra -c -S -O3 -o /dev/stdout
# nothing is printed for the 1st time
UPD3。我可以在另一台机器上用 clang 重现它:
$ clang t455.c -S -o /dev/stdout
.text
<asm code>
# introduce the error
$ clang t455.c -S -o /dev/stdout
t455.c:26:1: error: unknown type name 'x'
x
^
t455.c:26:2: error: expected identifier or '('
x
^
2 errors generated.
# fix the error
$ clang t455.c -S -o /dev/stdout
# nothing is printed
$ clang --version
clang version 8.0.1 (tags/RELEASE_801/final)
以下mount cifs
代码工作正常:
sudo mount -t cifs //192.168.1.77/something /mnt/192.168.1.77/something \
-o username=alpha,rw,uid=alpha,gid=tango,dir_mode=0770,file_mode=0770,nounix,sec=ntlmssp
通过在终端中执行的 shell 脚本出现一个新行:
� Password for alpha@//192.168.1.77/something:
如果密码正确,则终端不会写入/放置/显示任何内容,并且目录已按预期挂载。但是如果密码不正确,它会显示
mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs) and kernel log messages (dmesg)
我想创建一个循环迭代始终 while: 如果终端中出现任何错误消息以再次执行命令并因此要求输入密码。当然,如果密码正确并且mount cifs
返回的内容表明一切正常,则必须停止循环。
如何做到这一点?我试过命令替换:
result=$(sudo mount -t cifs //192.168.1.77/something /mnt/192.168.1.77/something \
-o username=alpha,rw,uid=alpha,gid=tango,dir_mode=0770,file_mode=0770,nounix,sec=ntlmssp)
echo "result: '${result}'"
并发生以下情况:
# Valid password scenario
� Password for alpha@//192.168.1.77/something:
result: ''
# Invalid password scenario
� Password for alpha@//192.168.1.77/something:
mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs) and kernel log messages (dmesg)
result: ''
即使使用命令替换,您也无法看到预期的效果。结果变量总是为空。
不确定是否存在mount cifs
该启用的参数返回一些东西然后让结果变量显示一些东西
该tr
命令的参数之一是:
-u
保证任何输出都是无缓冲的。
在什么情况下不缓冲输出是个好主意?
例如,-u
如果我希望每行都超长,我应该使用吗?
例如,-u
如果我的内存受限,我应该使用吗?
例如,如果我将它输入awk
(逐行处理文件),那么这是否意味着使用缓冲输出更好?
下面片段中的关键语句(即除了用于打印标签和空白行的那些,用于间距)成对出现。在每一对中,第一个和第二个语句的形式分别为tty...
和。echo $(tty...)
echo stdin:
tty
echo $(tty)
echo
echo stdout:
tty <&1
echo $(tty <&1)
echo
echo stderr:
tty <&2
echo $(tty <&2)
如果我获取包含此片段的文件(例如,在一个zsh
或bash
会话中),我会得到以下输出1(我随后添加了行号,以供参考):
1 stdin:
2 /dev/pts/8
3 /dev/pts/8
4
5 stdout:
6 /dev/pts/8
7 not a tty
8
9 stderr:
10 /dev/pts/8
11 /dev/pts/8
在此输出中,由echo $(tty <&1)
(第 7 行)生成的行显着突出,原因有两个:
echo $(tty ...)
行(即,第 3、7 和 11 行)中唯一与其tty ...
前面的 - 生成的对应物(第 2、6 和 10 行)不同的行;和echo $(tty <&2)
。问:如何解释这两个差异?
作为记录,我试图在 的手册页中找到这些明显异常的解释tty
,但是,据我所知,该页面根本没有解决这些问题2;当然不是明确的3。
这个问题是由一些代码激发的,这是我早期问题的一个很好的答案。
1当然,/dev/pts/
如果我更换终端后实际数字会有所不同,如果您尝试相同的事情,您可能会有所不同。
2事实上,tty
我系统上可用的手册页的整个说明部分仅包含一句话:“打印连接到标准输入的终端的文件名。”。
3在这里,我保留一个可能性,即比我拥有更多背景知识的人可能能够从's 简洁的手册页中推断tty
出上述行为。
据我所知,该命令生成的某些输出/usr/bin/modulecmd
既不会发送到 stdout 也不会发送到 stderr,如下例所示:
% /usr/bin/modulecmd bash help null >/dev/null 2>&1
This module does absolutely nothing.
It's meant simply as a place holder in your
dot file initialization.
Version 3.2.9
有什么方法可以调用命令(例如 /usr/bin/modulecmd),使其所有输出都发送到 stdout 或 stderr?或者,是否有某种方法可以调用代码/usr/bin/modulecmd
来捕获它通常会发送到终端的所有输出?
这是正常的重定向。
user@linux:~$ randomcommand
randomcommand: command not found
user@linux:~$
2>
user@linux:~$ randomcommand 2> /dev/null
user@linux:~$
&>
user@linux:~$ randomcommand &> /dev/null
user@linux:~$
但是,当我尝试使用不同的命令执行相同操作时,它不起作用,如下所示。
&>
user@linux:~$ > /dev/tcp/127.0.0.1/22 &> /dev/null && echo open || echo closed
bash: connect: Connection refused
bash: /dev/tcp/127.0.0.1/22: Connection refused
closed
user@linux:~$
2>
user@linux:~$ > /dev/tcp/127.0.0.1/22 2> /dev/null && echo open || echo closed
bash: connect: Connection refused
bash: /dev/tcp/127.0.0.1/22: Connection refused
closed
user@linux:~$
这些语法有什么问题以及如何解决?