1
moen 2022-12-02 23:17:20 +08:00
可能你看到其实是输出到 stderr ,直接重定向当然是没有内容
|
3
gam2046 2022-12-02 23:23:56 +08:00
有些程序指的是哪些,给几个例子看,让人上来就猜是不是有点困难。
|
5
conanforever22 2022-12-02 23:53:11 +08:00
我之前遇到过这样的问题,不知道和你的情况是否类似
```sh cmd_write_to_stderr 2>&1 > foo.txt # > 在 2>&1 后边的话是重定向不成功的 ``` 但是 ```sh cmd_write_to_stderr > foo.txt 2>&1 # > 在 2>&1 前边的话是没问题的 ``` |
6
kirory 2022-12-02 23:55:48 +08:00
因为没有用 stdout / stderr, 比如 sudo 的输入用的都不是这些,而是直接读写终端
|
7
kirory 2022-12-02 23:58:55 +08:00 2
比如这些命令,对应的设备可能不是 1 ,可以多试几个数字
echo Hello > /dev/pts/1 cat < /dev/pts/1 |
9
geelaw 2022-12-03 00:08:17 +08:00 via iPhone 1
因为程序可以选择查看自己的标准流是哪里并选择不同的行为。比如 git diff 在 stdout 接入 terminal 的时候默认使用转义序列显示彩色,但 stdout 接入文件时默认不用。
|
10
varius OP @conanforever22 有些类似
|
14
luvjoey1996 2022-12-03 01:09:40 +08:00 via Android
@conanforever22 参考一下 shellcheck
|
15
bigdoing 2022-12-03 01:11:36 +08:00 via iPhone
还是让高手来回答你们
程序判断输出是 tty 的时候,按照行缓冲输出,有了新一行,就写 如果是 pipe 的话,就会攒着,到一大块的时候,再写 这种一般有参数控制,比如 grep ,就有一个参数控制 |
17
jasonyang9 2022-12-03 07:54:48 +08:00
|
18
aloxaf 2022-12-03 08:39:06 +08:00
@varius
在伪终端里运行它们即可,zsh 用户的而话可以直接用 zpty 命令: https://github.com/lilydjwg/dotzsh/blob/master/zshrc#LL561-L561C7 |
19
7RTDKSAK 2022-12-03 15:31:00 +08:00 1
@conanforever22
因为重定向是有序地(至少在 BASH 中是有序地,其它 SHELL 我不了解) 第一种写法: 第一阶段:文件描述符 1 和 2 都指向屏幕(姑且说成"屏幕",方便理解),你把串流 2 重定向到了串流 1,而串流 1 又指向了屏幕,所以最终效果就是串流 2 指向了屏幕(虽然它原来也指向屏幕),串流 1 没有变化依旧指向屏幕 第二阶段:在第一阶段(或者说在以前所有重定向阶段)基础上,串流 1 重定向到了文件(所以在屏幕上看不到了),串流 2 没有变化依旧指向屏幕 所以最终效果就是你所说得"重定向不成功" 第二种写法: 略,言之有理即可(滑稽) 另外,推荐&>file 这种写法,一次性把文件描述符 1 和 2 同时重定向到文件 |
20
JohnBull 2022-12-03 17:32:42 +08:00
不可能的
肯定是太着急了,数据还在 buffer 里没刷出来呢,你就去看输出文件,发现是空的,就 sigint 了…… |
21
varius OP @jasonyang9 谢谢老哥指教
|