( ) 和 & 的区别是什么?(涉及IT技术)

9
我想知道在bash中这两种语法的区别:( &)( ) &。唯一我注意到的区别是,(tty &)会返回“不是tty”,而(tty) &将返回当前tty名称,但为什么?
举个例子,我该运行(setsid startx &)还是(setsid startx) &
1个回答

6
在这种情况下,
(tty &)

一个子shell被启动,它在后台启动另一个tty进程,没有作业控制和终端,因此会出现“not a tty”错误。这个tty进程与PPID 1分离。

在这种情况下

(tty) &

一个子shell被启动并在后台运行。这个后台shell会启动一个tty进程,在tty完成并向终端报告后,子shell在后台完成。
-- tty是一个简单的命令。一个特定的命令(如startx)是否需要( ... &)结构来从父进程中分离/解除关联取决于该命令本身。有许多方法可以使一个进程再启动子进程并将其分离,因此该命令可能不需要它。

如果 X & 在没有控制终端的情况下运行 X,那么似乎 (tty)& 会在没有控制终端的情况下运行子 shell,因此 tty 命令也不会有控制终端。这种差异是由于后台进程是否由会话领导者启动引起的吗? - Vaughn Cato
@VaughnCato,一个进程启动并分离子进程有很多种方式。同时,如果一个命令是从交互式 shell 中执行的,也会有所不同。如果在交互式 shell 中执行 (tty)& 命令,它将无法在没有控制终端的情况下运行。你可以通过将 tty 替换为 sleep 60 等命令,并使用 ps 进行检查来轻松测试此问题。 - Scrutinizer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接