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命令结合使用来等待进程结束。