为什么这不打印任何东西?
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
,甚至根本不重定向输出。