Bash Shell 中 $! 表示什么意思 ?
参考回答
在Bash Shell中,$!
表示最后一个后台执行的进程的进程ID(PID)。后台进程是指通过 &
符号在Shell中启动的进程。
示例:
#!/bin/bash
sleep 10 & # 启动一个后台进程
echo "后台进程的PID是: $!" # 显示后台进程的PID
在这个例子中,sleep 10 &
会在后台运行,而 $!
会返回这个后台进程的PID。
详细讲解与拓展
- 背景进程:
在Shell中,任何通过&
符号启动的命令都会在后台运行。例如:sleep 10 & # 后台执行 sleep 命令 echo "后台进程正在运行"
这里,
sleep 10 &
将使得sleep
命令在后台执行,而Shell会立即继续执行后续的命令。 -
使用
$!
获取后台进程的PID:
变量$!
存储的是最近启动的后台进程的进程ID(PID)。你可以使用这个PID来管理或监控后台进程。例如:sleep 10 & # 启动后台进程 pid=! # 获取后台进程的PID echo "后台进程的PID:pid" wait $pid # 等待后台进程结束 echo "后台进程已经结束"
在这个示例中,
wait $pid
会等待指定PID的后台进程结束。$!
返回的是最近一个后台进程的PID,所以你可以使用它来管理和控制这个进程。 -
多个后台进程:
如果你同时启动多个后台进程,$!
只会返回最后一个启动的后台进程的PID。因此,如果你需要同时跟踪多个后台进程,可以手动保存各个PID:sleep 5 & # 启动第一个后台进程 pid1=! sleep 10& # 启动第二个后台进程 pid2=! echo "第一个后台进程的PID: pid1" echo "第二个后台进程的PID:pid2"
wait
命令的配合使用:
wait
命令用于等待后台进程结束。wait
可以使用PID作为参数,也可以在不指定PID时,等待所有后台进程结束。如果你想等待特定的后台进程结束,可以使用它的PID:sleep 5 & # 启动第一个后台进程 pid1=! sleep 10& # 启动第二个后台进程 pid2=! wait pid1 # 等待第一个后台进程结束 waitpid2 # 等待第二个后台进程结束
- 注意事项:
$!
仅在当前Shell会话中有效,它返回的是最近执行的后台进程的PID。如果你在同一Shell会话中启动多个后台进程,只有最后一个后台进程的PID会被$!
返回。$!
无法用于获取前面执行过的后台进程的PID。如果你想跟踪多个后台进程,应该显式地保存每个进程的PID。
总结
$!
用于获取最后一个后台执行的进程的PID。- 它通常与
&
结合使用来启动后台进程,并与wait
命令结合使用来等待进程结束。