jobs — List background and stopped jobs in the current shell session across all 5 shells
Equivalents in every shell
Bashunix
jobsZshunix
jobsFishunix
jobsPowerShellwindows
Get-JobPowerShell 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 -lFish
jobs -pPowerShell
Get-Job | Format-Table Id, Name, State, PSJobTypeNameList only running (not stopped) jobs
Bash
jobs -rPowerShell
Get-Job -State RunningRemove a finished job from the list
Bash
disown %1PowerShell
Remove-Job -Id 1Gotchas
- `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.