我正在尝试将bash的所有输出(提示,用户输入,结果)重定向到文件
例:
/bin/bash > file.txt 2>&1
我以为可以,但是没有得到提示。谁能告诉我我在做什么错?
我正在尝试将bash的所有输出(提示,用户输入,结果)重定向到文件
例:
/bin/bash > file.txt 2>&1
我以为可以,但是没有得到提示。谁能告诉我我在做什么错?
Answers:
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,就好像没有重定向一样。像提示一样,输出直接发送到终端(如果没有,它将失败)
提示:如果您希望收集所有信息,请查看
set -o xtrace
(又名set -x
,bash -x
等)为一般日志报表seq
是一个高度非标准的外部命令,不应以这种方式使用。如果您使用bash
,请执行for x in {1..10}
或for ((x=1; x<=10; x++))
代替。
为了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
)
最简单的方法是
bash -i >/tmp/logfile 2>&1
Bash会将所有内容写入/tmp/logfile
并在您键入命令时继续执行命令,但是终端中将不显示任何内容。您可以像退出终端会话一样退出它-通过按Ctrl+ D或键入exit
。
请注意,如果您在不stderr
重定向的情况下运行同一内容,则只会将问候消息记录到该文件中,其余所有消息将在您当前的终端中运行。因此,关于bash将其提示(以及以下所有命令)输出到的流的问题的答案似乎是:stderr。
哦,是的,该-i
参数只是强制bash在交互模式下运行。不要听那些人的声音-您不需要任何魔术即可;)
<sub>
格式化。我今天刚学到新东西。:D
提示以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