Bash将其提示写入哪个流?


8

我正在尝试将bash的所有输出(提示,用户输入,结果)重定向到文件

例:

/bin/bash > file.txt 2>&1

我以为可以,但是没有得到提示。谁能告诉我我在做什么错?

Answers:


9

Bash仅在交互模式下输出提示。即,它通常输出到终端(在Linux上为/ dev / tty)。那既不是/ dev / stdout也不是/ dev / stdin :)

现在,我不确定,但是我可以想象,当没有功能齐全的tty时,bash将允许受限的交互模式。在那种情况下,我希望将提示写入stdout。我还没有测试过。

好的概念证明:

(for a in some set of words; do echo $a > /dev/tty; done) 2>&1 > /dev/null

只会输出1..10,就好像没有重定向一样。像提示一样,输出直接发送到终端(如果没有,它将失败)

提示:如果您希望收集所有信息,请查看


添加了有关如何潜在地向管道中输出更多bash的提示
sehe 2011年

seq是一个高度非标准的外部命令,不应以这种方式使用。如果您使用bash,请执行for x in {1..10}for ((x=1; x<=10; x++))代替。
克里斯·

@Chris:好点,谢谢大家的注意
sehe 2011年

2

为了bash使它认为它处于交互模式(尽管stdout没有发送到终端),您可以使用已经提到的script命令。

(
exec 1> >(tee bashlog.txt) 2>&1
script -q /dev/null /bin/bash -l
)

# alternative without script command
(
# bash: no job control in this shell
exec 1> >(tee bashlog.txt) 2>&1
/bin/bash -il
)

2

最简单的方法是

bash -i >/tmp/logfile 2>&1

Bash会将所有内容写入/tmp/logfile并在您键入命令时继续执行命令,但是终端中将不显示任何内容。您可以像退出终端会话一样退出它-通过按Ctrl+ D或键入exit

请注意,如果您在不stderr重定向的情况下运行同一内容,则只会将问候消息记录到该文件中,其余所有消息将在您当前的终端中运行。因此,关于bash将其提示(以及以下所有命令)输出到的流的问题的答案似乎是:stderr

哦,是的,该-i参数只是强制bash在交互模式下运行。不要听那些人的声音-您不需要任何魔术即可;)


+1用于<sub>格式化。我今天刚学到新东西。:D
克里斯·K

2

提示以truss的形式写入到stderr(在Solaris上显示):

$ truss -ft write -p 10501
10501:  write(2, " d", 1)               = 1
10501:  write(2, " a", 1)               = 1
10501:  write(2, " t", 1)               = 1
10501:  write(2, " e", 1)               = 1
10501:  write(2, "\n", 1)               = 1
10521:  write(1, " S a t u r d a y ,   S e".., 46)  = 46
10501:      Received signal #18, SIGCLD [caught]
10501:        siginfo: SIGCLD CLD_EXITED pid=10521 status=0x0000
10501:  write(2, " $  ", 2)             = 2
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.