Skip to content
shellmap

jobsList background and stopped jobs in the current shell session across all 5 shells

Equivalents in every shell

Bashunix
jobs
Zshunix
jobs
Fishunix
jobs
PowerShellwindows
Get-Job

PowerShell jobs are a different model — `Start-Job { ... }` spawns a separate PowerShell process and `Get-Job` lists them. There is no Unix-style suspend / resume of foreground commands.

cmd.exewindows
tasklist /fi "username eq %USERNAME%"

cmd.exe has no shell-managed job concept. The closest is enumerating processes the current user has launched; `start /b cmd` launches a background process but cmd does not track it as a "job".

Worked examples

List jobs with their PIDs

Bash
jobs -l
Fish
jobs -p
PowerShell
Get-Job | Format-Table Id, Name, State, PSJobTypeName

List only running (not stopped) jobs

Bash
jobs -r
PowerShell
Get-Job -State Running

Remove a finished job from the list

Bash
disown %1
PowerShell
Remove-Job -Id 1

Gotchas

  • `jobs` lists jobs spawned by the *current shell process*. Closing the terminal sends `SIGHUP` and kills them unless `disown` (bash / zsh) or `nohup` is used first.
  • PowerShell `Start-Job` runs in a separate PowerShell process — high overhead per job. For lightweight parallelism, prefer `ForEach-Object -Parallel` (PS 7+) or `Start-ThreadJob`.
  • fish jobs use positional integer IDs for `jobs` itself (`jobs 1`), but still accept `%1`-style references in `kill` / `fg` / `bg`.
  • cmd.exe lacks the concept entirely; for real job control on Windows, run inside PowerShell, WSL, or Git Bash.

WSL & PowerShell Core notes

pwshpwsh background jobs are an entirely different model from Unix shell jobs: `Start-Job` spawns a separate pwsh subprocess (high startup cost), `Get-Job` lists them on the current session, `Receive-Job` collects their output. There is NO equivalent to the Unix Ctrl+Z → SIGTSTP → `bg` workflow for suspending an interactive foreground command. For lightweight parallelism without the per-job pwsh process overhead, prefer `ForEach-Object -Parallel` (pwsh 7+) or `Start-ThreadJob` — both share the parent process and skip the cold-start.
WSLWSL bash `jobs` only sees Linux processes spawned inside the same WSL session. Processes launched via `cmd.exe /c start /b long-task` from inside WSL live in the Windows-side process tree and are invisible to bash's job table; conversely, `wsl.exe long-task &` from Windows-side pwsh creates a job in the bash session that owns it. Closing the Windows Terminal tab sends SIGHUP and kills bash-tracked jobs as usual — use `nohup` or `disown %1` to detach. `wsl --shutdown` kills the entire WSL VM regardless, so `nohup`-detached jobs do NOT survive it.

Common tasks using jobs

Related commands