who(1) on Solnix vs Linux and the BSDs
On Solnix, who is the illumos who at /usr/bin/who, and it reads /var/adm/utmpx by default. It accepts far more flags than FreeBSD or OpenBSD (-a, -b, -d, -l, -p, -r, -t) and has -n, which no counterpart documents. -T is the flag most likely to surprise you, because its output differs between /usr/bin/who and /usr/xpg4/bin/who.
The manual pages
- Solnix: who(1) from
pkgs.solnix.illumos-world-man· illumos.org - Linux: who(1) coreutils-full-9.11
- FreeBSD: who(1) 15.1-RELEASE
- OpenBSD: who(1) 8.0
- NetBSD: who(1) 11.0
- Standard: POSIX.1-2024 (IEEE Std 1003.1-2024),
who
What Solnix runs
A default Solnix system runs the illumos /usr/bin/who. /usr/xpg4/bin/who is also shipped. The page documents these differences: /usr/bin/who -T also writes idle, pid and comment, while the xpg4 -T writes only the state field. -s appears in the xpg4 synopsis only as the separate form 'who -s [-bdHlmpqrtu]'.
Differences
| Compared with | Topic | What differs |
|---|---|---|
| all four | default database file | Solnix who reads /var/adm/utmpx. Linux and OpenBSD read /var/run/utmp, FreeBSD reads /var/run/utx.active, and NetBSD reads /var/run/utmpx. Solnix suggests /var/adm/wtmpx as the history file. Linux and OpenBSD suggest /var/log/wtmp, FreeBSD /var/log/utx.log, and NetBSD /var/log/wtmpx or /var/log/wtmp.Source: Solnix who(1) DESCRIPTION; Linux who(1) FILE text; FreeBSD who(1) DESCRIPTION; OpenBSD who(1) file; NetBSD who(1) file |
| all four | -T output | Solnix /usr/bin/who -T acts like -s but also writes state, idle, pid and comment. The xpg4 version writes only state. Linux and FreeBSD add a message-status character. OpenBSD and NetBSD print a character after the user name.Source: Solnix who(1) -T under /usr/bin/who and /usr/xpg4/bin/who; Linux who(1) -T; FreeBSD who(1) -T; OpenBSD who(1) -T; NetBSD who(1) -T |
| Linux | -w and long options | Solnix who has no -w and no long options. Linux accepts -w, --mesg, --message and --writable as synonyms for -T, plus --all, --boot, --count, --heading and others, as well as --lookup. A Linux script using these fails on Solnix.Source: Linux who(1) -T, -w, --mesg, --message, --writable, --lookup; Solnix who(1) SYNOPSIS |
| FreeBSD, OpenBSD | missing flags | FreeBSD who has no -d, -l, -p, -r or -t, and OpenBSD has no -a or -b either. Solnix has all of these. OpenBSD says -abdlprst are not supported by its who.Source: FreeBSD who(1) SYNOPSIS; OpenBSD who(1) SYNOPSIS, STANDARDS; Solnix who(1) SYNOPSIS |
| all four | -n users per line | Solnix who -q -n x sets the number of users shown per line, with x at least 1. -n works only with -q. None of the counterpart pages documents -n.Source: Solnix who(1) -n, SYNOPSIS; Linux, FreeBSD, OpenBSD, NetBSD who(1) SYNOPSIS |
| Linux, FreeBSD, NetBSD | -a contents | Solnix -a turns on -b, -d, -l, -p, -r, -t, -T and -u. Linux -a is the same set. FreeBSD -a equals -bTu. NetBSD -a equals -bdlprTtuv. OpenBSD has no -a.Source: Solnix who(1) -a; Linux who(1) -a; FreeBSD who(1) -a; NetBSD who(1) -a; OpenBSD who(1) SYNOPSIS |
| NetBSD | -v and -r detail | NetBSD has -v, which adds termination signals, exit status, session id and entry type. Solnix has no -v. Solnix -r only indicates the current run-level, whereas NetBSD -r documents its run-level letters (d, s, r, t, m, T, c).Source: NetBSD who(1) -v, -r; Solnix who(1) -r, SYNOPSIS |
| Linux, OpenBSD | am i operand | Solnix 'am i' and 'am I' are equivalent to -m only in the C locale, and the words must be separate arguments. Linux presumes -m for any two arguments ('mom likes' works). OpenBSD says 'am i' returns the invoker's real user name.Source: Solnix who(1) OPERANDS; Linux who(1) ARG1 ARG2; OpenBSD who(1) am i |
| Linux, OpenBSD, NetBSD | environment variables | Solnix lists LANG, LC_ALL, LC_CTYPE, LC_MESSAGES, LC_TIME and NLSPATH. FreeBSD lists COLUMNS, LANG, LC_ALL and LC_TIME. The Linux, OpenBSD and NetBSD pages in the bundle document no environment variables. Source: Solnix who(1) ENVIRONMENT VARIABLES; FreeBSD who(1) ENVIRONMENT; Linux, OpenBSD, NetBSD who(1) |
| all four | single-user state | On Solnix, after shutdown to single-user state, plain who returns only a prompt, because utmpx is updated at login. who am i still reports correctly. No counterpart page mentions this. Source: Solnix who(1) NOTES; Linux, FreeBSD, OpenBSD, NetBSD who(1) |
| all four | init-related fields | Solnix -d adds an exit field for dead processes, and -l shows lines waiting for login with the name LOGIN. The comment field comes from /etc/inittab. The Solnix page documents this for init-based systems.Source: Solnix who(1) -d, -l, -p, DESCRIPTION; Linux who(1) -d, -l, -p |
Standards
- POSIX: who is a POSIX.1-2024 utility.
- Solnix: ATTRIBUTES for
/usr/xpg4/bin/who: Interface Stability is Standard. - FreeBSD: The who utility conforms to IEEE Std 1003.1-2001 (“POSIX.1”).
- OpenBSD: Compliant with IEEE Std 1003.1-2008 (“POSIX.1”). Flags [
-abdHlpqrst] are an X/Open System Interfaces option, and of these [-abdlprst] are not supported. - NetBSD: Expected to conform to IEEE Std 1003.2-1992 (“POSIX.2”).
Writing portable scripts
- Portable scripts should use only
-H,-m,-q,-T,-uand 'am i'. Every system in the bundle documents these, except that Solnix-Toutput and OpenBSD 'am i' behaviour differ. - Do not rely on
-a,-nor-w. They mean different things or are missing across Solnix, FreeBSD, OpenBSD, NetBSD and Linux. - Do not hard-code the utmp path. Run plain who, or pass a file only after checking which of the paths above exists.
Every difference here is taken from the manual pages linked above: Solnix's published page, Linux (man-pages and the GNU and util-linux manuals), FreeBSD, OpenBSD and NetBSD. Each row names its source. Where a manual is silent, this page is too. Compiled 2026-10-26. Found a mistake? Mail hackers@lists.solnix.io.