magus v0.4.3 is out. See what's new
¶ View markdown source · ✎ Suggest an edit
1 min read

sed-in-place

An advisory by default: it explains, and blocks nothing, on sed -i, whose two spellings destroy each other's work across platforms.

What it catches

sed -i, whose two spellings destroy each other's work across platforms.

Why

sed -i is not portable and the two spellings destroy each other's work. GNU reads sed -i 's/x/y/' f as an edit; BSD and macOS read that same script as the BACKUP SUFFIX and take the next argument as the script. sed -i '' ... is the macOS spelling and makes GNU edit nothing. So a command that works here mangles the file on the next machine, by WRITING, before anyone reads a diff. An editor tool reads the file first and reports what it changed, and for a whole-tree rename magus refs <symbol> --occurrences gives column-precise sites a pattern cannot. Reading with sed is untouched.

Default and override

By default this rule takes the decision advise. A workspace sets it by name, in its root magusfile, to deny, advise or off:

magus\guard.builtins({"sed-in-place": "deny"})

A loosening takes effect once it is committed; a tightening applies at once.

Seeing it

A verdict names its rule in brackets, which is how you got here:

advise [sed-in-place]: ...

magus describe rule sed-in-place prints the same entry at a terminal, and magus describe rules lists every rule this workspace enforces.

See also

guardrulessed-in-placeadvise
Last updated (1a76274f)
Earlier changes on this page (1)

Full history ↗ · Blame source ↗

Glossary

Workspace

The magus root directory that owns a set of projects and shared config; the unit magus operates over. See workspace.

Magusfile

The magusfile.buzz that declares a project's targets (as export funs) and binds its spells. See targets.

Spell

A language/runtime adapter (e.g. go, md) that maps generic targets onto a toolchain's real commands. See spells.

Buzz

The language magusfiles are written in (the .buzz engine). See engines.

CI

An ordinary magusfile-defined target you compose yourself with magus\needs: magus does not hardcode its stages. Magus.RunCI treats it specially only in that it strips the rw charm, it is the anchor magus affected ci keys off, and a selected scope with no project declaring it is a load error rather than a silent no-op. See targets.

Advisor

One read-only check from the advice suite: it reads the changeset through magus and writes one titled section of findings. The same advisors run as a pull request comment in CI and inside magus diff --impact locally.

Conventions

Placeholders

Angle brackets mark a value you replace with your own; never type the brackets:

magus run <target>
magus completion <shell>    # e.g. bash, zsh, fish

<target>, <path>, <shell>, <name> and the like are stand-ins, not literal text.