Why is pattern "command || true" useful?
The reason for this pattern is that maintainer scripts in Debian packages tend to start with set -e
, which causes the shell to exit as soon as any command (strictly speaking, pipeline, list or compound command) exits with a non-zero status. This ensures that errors don't accumulate: as soon as something goes wrong, the script aborts.
In cases where a command in the script is allowed to fail, adding || true
ensures that the resulting compound command always exits with status zero, so the script doesn't abort. For example, removing a directory shouldn't be a fatal error (preventing a package from being removed); so we'd use
rmdir ... || true
since rmdir
doesn't have an option to tell it to ignore errors.
While it does not affect the output of the program just run - it permits the caller to proceed as if all is okay aka affects future logic.
Rephrased: it masks the error status of the previous command.
michael@x071:[/usr/sbin]cat /tmp/false.sh
#!/bin/sh
false
michael@x071:[/usr/sbin]cat /tmp/true.sh
#!/bin/sh
false || true
michael@x071:[/usr/sbin]sh /tmp/false.sh; echo $?
1
michael@x071:[/usr/sbin]sh /tmp/true.sh; echo $?
0