Macos 转义mac osx外壳上的上一个bg作业pid($!)

Macos 转义mac osx外壳上的上一个bg作业pid($!),macos,bash,Macos,Bash,我正在尝试运行后台作业并从bash命令行获取其PID,例如: $ cat & $ echo $! 这两个命令工作得很好,但是如果我尝试将它们内联到一行中,我会遇到bash历史扩展与$冲突的问题: $ (cat &); echo $!; -bash: !: event not found 我尝试过在感叹号周围使用各种类型的引号,但我能得到的最多的结果是echo显示文本字符串“$!” 任何帮助都将不胜感激 您正在使用&分隔符将第一个命令放在后台。通过分配$,您可以轻松捕获后台进程

我正在尝试运行后台作业并从bash命令行获取其PID,例如:

$ cat &
$ echo $!
这两个命令工作得很好,但是如果我尝试将它们内联到一行中,我会遇到bash历史扩展与
$冲突的问题

$ (cat &); echo $!;
-bash: !: event not found
我尝试过在感叹号周围使用各种类型的引号,但我能得到的最多的结果是echo显示文本字符串
“$!”


任何帮助都将不胜感激

您正在使用
&
分隔符将第一个命令放在后台。通过分配
$,您可以轻松捕获后台进程的
pid
到一个变量,以后用于终止进程(或者您可以将其写入tmp文件):例如

您还必须选择使用
jobs
命令检查后台进程的状态,以列出后台作业,并使用
fg
(前台)命令将该命令带到前台。如果您还有任何问题,请告诉我们

为了完成您正在尝试的操作,您必须在使流程后台化之前重定向
stderr
stdout

cat 2>&1 & echo $!

为什么你需要把它作为一个单行线?无论如何,您不需要编写
之后,因为与符号本身是命令分隔符。这意味着您可以运行
cat&echo$。最简单的答案是关闭历史扩展。默认情况下,它在脚本中处于关闭状态,并且使用现代的readline功能,也不需要以交互方式使用它。(还有@marbu所说的:
&
)。感谢您的及时回复。
&
是一个命令分隔符,这对我来说是新的,谢谢你指出这一点。至于为什么我需要把它作为一个单一的?没有什么真正的原因,我只是喜欢胡闹。谢谢你的回复,但你完全没有抓住要点,因为:1)我已经知道什么是
&
$执行,和;2) 您的代码示例在Mac OSX终端上不起作用,这实际上是我首先提出问题的目的。对于误解,我深表歉意。在单行命令中,您应该在创建后台之前重定向stderr和stdout。例如,
cat2>&1&echo$添加到答案中。
cat 2>&1 & echo $!