在后台进程中回显 $(tty)

在后台进程中回显 $(tty)

为什么这不打印任何东西?

bash -c '(while echo "not printing" ; do sleep 1; done) > "$(tty)" & sleep 10'

例如,即使这样:

bash -c '(while echo "is printing" ; do sleep 1; done) > "$(tty)" && true'

答案1

让我们执行第一个命令,并在临时目录中运行它:

mkdir eg1    # Create temporary directory
cd eg1       # ...and change to it
ls           # No output (obviously, no files)

bash -c '(while echo "not printing" ; do sleep 1; done) > "$(tty)" & sleep 10'

但现在看看目录:

ls -l
-rw-r--r--+ 1 roaima roaima 1040 Jun  6 23:05 not a tty

这里发生的是tty命令报告终端设备,例如/dev/pty0当它在连接终端的情况下执行时,以及not a tty其他情况下的消息。当它&作为子 shell () 在后台 () 运行时,( … )没有终端设备,因此输出被重定向到名为not a tty.

现在,在第二种情况下,除了子 shell 不在后台执行之外,一切都非常相似:

bash -c '(while echo "is printing" ; do sleep 1; done) > "$(tty)" && true'

在本例中,tty它在前台运行,并且可以返回当前终端的设备名称,因此您可以在屏幕上看到输出。

请注意,这&&是一个逻辑连接器,只有当第一个命令返回“成功”(0 值)退出状态时,第二个命令才会运行。不要将其与 混淆&,后者指示前面的命令在后台独立运行:

# Run the ( ... ) in the background concurrently with the foreground process
( sleep 1; echo background ) & echo foreground; wait

[1] 32301
foreground
background
[1]+  Done                    ( sleep 1; echo background )

# Run the ( ... ) and then if it's successful execute the next statement
( sleep 1; echo background ) && echo foreground; wait

background
foreground

根据您想要实现的目标,您可能需要考虑使用/dev/tty,甚至根本不重定向输出。

相关内容