Skip to content
Productivity Passport
Practice mode · free · unlimited · not certifiable

Linux Shell

Unscored tasks with hints and instant feedback. Practice results never become credentials.

Short lesson

Pipelines in one minute · 8 min

Combine small tools: grep filters lines, awk/cut pick fields, sort | uniq -c counts, xargs turns lines into arguments. Read logs with journalctl -u UNIT.

L1Read a config valueterminal

Find which port the billing service is configured to use. The config lives somewhere under ~/services. Enter the port number as your answer.

Sign up to practise
L1Set up a project folderterminal

Create ~/work/clients/acme/{contracts,invoices,notes} (three folders) and copy ~/templates/invoice.md into the invoices folder.

Sign up to practise
L2Count errors per dayterminal

From ~/logs/app.log, write the number of ERROR lines per day into ~/errors-by-day.txt as lines like “2026-10-17 2”, sorted by date.

Sign up to practise
L2Make scripts executableterminal

Every *.sh file under ~/bin (including subfolders) must be executable by you. Do not change other files.

Sign up to practise
L2Environment variablesterminal

Add an environment variable API_URL=https://api.acme.example to ~/.zshrc so new shells get it, and export it in the current shell too.

Sign up to practise
L2Persist a productivity aliasterminal

Create an alias gs for “git status” that works now and in future shells (~/.zshrc).

Sign up to practise
L3Revenue by regionterminal

Using ~/data/sales.csv, write total amount per region to ~/report.txt as “REGION TOTAL” lines, highest total first.

Sign up to practise
L3Extract with jqterminal

~/users.json lists accounts. Write the emails of active users on the pro plan, one per line, into ~/active-pro.txt.

Sign up to practise
L3Delete files listed in a manifestterminal

~/cleanup.txt lists files (one per line, relative to ~/media) that must be deleted. Delete exactly those files.

Sign up to practise
L3Write a log summary scriptterminal

Create an executable script ~/bin/logcount.sh that prints, for every *.log file in the directory given as its first argument, a line “NAME COUNT” where COUNT is the number of lines containing ERROR.

Sign up to practise
L3Schedule a jobterminal

Schedule ~/bin/backup.sh to run every day at 02:30 for your user.

Sign up to practise
L3Two named panesterminal

Start a detached tmux session named work with two side-by-side panes titled editor and server. In the server pane, run: ls ~/app

Sign up to practise
L3Reuse historyterminal

Re-run the long deploy command from your history (it is already there) without retyping it, then save its output to ~/deploy.out. Use Ctrl-R or history expansion.

Sign up to practise
L4Free a blocked portterminal

Something is already listening on port 8080, so the new API cannot start. Find the process, stop it, and enter its name as your answer.

Sign up to practise
L4Regex fluency: attacking IPsterminal

From ~/auth.log write every distinct IPv4 address with a failed password attempt to ~/blocklist.txt, one per line, sorted.

Sign up to practise
L55xx offenders under time pressureterminal

From ~/access.log write the top 3 client IPs by number of 5xx responses to ~/top-5xx.txt as “COUNT IP” lines, highest first (ties: lower IP first).

Sign up to practise
L5Robust script with error handlingterminal

Write ~/bin/safe-archive.sh: it takes a directory argument, exits with status 2 and prints a usage message to stderr if the argument is missing or not a directory, and otherwise creates DIR.tar.gz next to the directory. Use set -euo pipefail.

Sign up to practise