fg命令

fg命令 #

fg命令(foreground)用于将后台作业带到前台运行。它是shell内置命令,是作业控制功能的一部分。

语法 #

fg [作业ID...]

作业ID #

作业ID可以使用以下格式指定:

格式 描述
%n 作业号为n的作业
%str 命令以str开头的作业
%?str 命令包含str的作业
%%%+ 当前作业(最近放入后台或停止的作业)
%- 上一个作业(当前作业之前的作业)

如果不指定作业ID,fg命令默认操作当前作业(%+%%)。

常见用法 #

1. 将当前后台作业带到前台 #

fg

2. 将特定作业带到前台 #

fg %1

3. 将命令以特定字符串开头的作业带到前台 #

fg %find

这会将命令以"find"开头的作业带到前台。

4. 将包含特定字符串的作业带到前台 #

fg %?txt

这会将命令包含"txt"的作业带到前台。

作业控制流程 #

典型的作业控制流程如下:

  1. 启动一个命令在后台运行(使用&操作符)
  2. 使用jobs命令查看作业状态
  3. 使用fg命令将后台作业带到前台
  4. 如果需要,按下Ctrl+Z暂停该作业
  5. 使用bg命令将其重新放到后台运行

实用示例 #

1. 启动后台作业并带到前台 #

# 在后台启动一个命令
sleep 100 &
[1] 1234

# 查看作业
jobs
[1]+  Running                 sleep 100 &

# 将其带到前台
fg %1
sleep 100

2. 管理多个后台作业 #

# 在后台启动多个命令
sleep 100 &
[1] 1234
sleep 200 &
[2] 5678
sleep 300 &
[3] 9012

# 查看作业
jobs
[1]   Running                 sleep 100 &
[2]-  Running                 sleep 200 &
[3]+  Running                 sleep 300 &

# 将第一个作业带到前台
fg %1
sleep 100
# 按Ctrl+Z暂停
[1]+  Stopped                 sleep 100

# 将第二个作业带到前台
fg %2
sleep 200

3. 在前台和后台之间切换作业 #

# 在后台启动一个命令
find / -name "*.txt" > results.txt &
[1] 1234

# 将其带到前台
fg
find / -name "*.txt" > results.txt

# 按Ctrl+Z暂停
[1]+  Stopped                 find / -name "*.txt" > results.txt

# 将其放回后台运行
bg
[1]+ find / -name "*.txt" > results.txt &

# 再次将其带到前台
fg
find / -name "*.txt" > results.txt

4. 使用作业名称引用作业 #

# 在后台启动一个命令
find / -name "*.txt" > results.txt &
[1] 1234

# 使用命令开头引用作业
fg %find
find / -name "*.txt" > results.txt

5. 在前台编辑文件,暂停,然后恢复 #

# 启动编辑器
vim file.txt

# 按Ctrl+Z暂停
[1]+  Stopped                 vim file.txt

# 执行其他命令
ls -la

# 恢复编辑
fg
vim file.txt

与其他命令的关系 #

fg命令通常与以下命令一起使用:

  • jobs:列出当前shell会话中的作业
  • bg:将已停止的作业放到后台运行
  • Ctrl+Z:暂停当前前台作业
  • &(命令后缀):在后台启动命令
  • kill:向作业发送信号(如终止信号)
  • wait:等待后台作业完成
  • disown:从当前shell的作业表中移除作业

注意事项 #

  1. fg命令只能操作当前shell会话中的作业,不能操作其他终端或会话中的作业。

  2. 当一个作业被带到前台后,它会接收终端的输入和信号。例如,按下Ctrl+C会向前台作业发送中断信号。

  3. 如果前台作业需要用户输入,它会等待用户输入。如果没有用户输入,它可能会一直等待。

  4. 在某些shell中,fg命令可能不可用或行为不同。

  5. 当shell会话终止时,所有作业(包括后台作业)通常也会终止,除非使用nohupdisown命令。

提示 #

  • 使用jobs命令可以查看当前shell会话中的所有作业
  • 使用fg命令不带参数时,它会操作当前作业(通常是最近的后台作业)
  • 使用fg %n可以指定要带到前台的作业号
  • 使用fg %-可以带回上一个作业
  • 在前台作业运行时,可以使用Ctrl+C终止它,或使用Ctrl+Z暂停它
  • 如果忘记作业号,可以使用jobs命令查看
  • 在脚本中,通常不使用fg命令,因为它需要交互式shell
  • 如果需要等待后台作业完成,可以使用wait命令而不是fg