Paste a shell script. Every flag that does not exist on macOS or BusyBox is marked, and the proof is that platform's own man page line and a real run of the binary there. Nothing is uploaded; the checks run in your browser.
A GitHub Actions matrix runs on ubuntu-latest (GNU coreutils), macos-latest (the BSD userland) and an alpine container (BusyBox). On each, for 81 common tools it records the --help output, the usage line and the man page source, and for the 74 that are safe to run it executes every short flag -a…-Z, -0…-9 and every long option any platform documents, classifying the answer by the tool's own unknown-option wording learned from a canary. Each flag runs twice, with and without an operand file, and one result is kept per flag: about 10,700 to 11,700 executions per platform, none of them hand-written. This page parses your script with tree-sitter-bash, resolves the static words, unwraps sudo, env, xargs, find -exec and sh -c, and looks every flag up. The order of trust: a real run beats the man page, the man page beats silence, and silence is reported as unknown.
The shell matters as much as the userland, so the collector also runs 142 shell constructs (arrays, ${x,,}, [[ ]], (( )), <( ), mapfile, an unquoted $var, a glob that matches nothing, cmd | read v, …) as one-line scripts under every shell each platform has: 14 interpreters, 143 one-liners, 2,002 recorded results with default options (5,434 with the zsh settings below); the constructs are the ones a scan of 2,905 real scripts found in use. The page reads your shebang (#!/bin/bash is bash 3.2 on macOS; #!/bin/sh is dash, bash-as-sh or BusyBox ash; no shebang means the default shell, zsh on a Mac) and compares each construct's recorded run under that interpreter with bash 5.2 on Ubuntu. Under zsh on macOS, 28 of the 142 constructs are errors and 19 print something else; the verdicts show both outputs. Each probe runs with the shell's startup files disabled (zsh --no-globalrcs --no-rcs, no $ENV/$BASH_ENV), so a row is the shell as shipped rather than somebody's configuration. Because a setopt of your own does change the answers, zsh is recorded eight more times under the knobs people reach for: shwordsplit, ksharrays, nonomatch, octalzeroes, bashrematch, all five at once, emulate sh and emulate ksh. The best of them, emulate sh, closes 13 of the 47 differences and gets two wrong that were right (brace expansion and declare -a print something else); 33 of the 47 are closed by nothing: 25 are errors none of the eight settings fixes, and 8 print something else under every one of them.
What it does not do: expand variables (a dynamic word is reported as not checked), understand find's expression language beyond the primaries it has recorded, or judge semantics when a flag exists on both sides with different meaning (stat -f). Shell builtins such as echo -e depend on the shell, not the userland, and are marked as such. Requested from ShellCheck since 2015 (#479, #2902); ShellCheck knows which shell you target, this knows which userland you run on.