Title: Implement a «Command not found» handler in OpenBSD | |
Author: Solène | |
Date: 09 March 2021 | |
Tags: openbsd | |
Description: | |
# Introduction | |
On many Linux systems, there is a special program run by the shell | |
(configured by default) that will tell you which package provide a | |
command you tried to run but is not available in $PATH. Let's do the | |
same for OpenBSD! | |
# Prerequisites | |
We will need to install the package pkglocate to find binaries. | |
```shell command as root | |
# pkg_add pkglocate | |
``` | |
We will also need a file /usr/local/bin/command-not-found executable | |
with this content: | |
```shell script | |
#!/bin/sh | |
CMD="$1" | |
RESULT=$(pkglocate */bin/${CMD} */sbin/${CMD} | cut -d ':' -f 1) | |
if [ -n "$RESULT" ] | |
then | |
echo "The following package(s) contain program ${CMD}" | |
for result in $RESULT | |
do | |
echo " - $result" | |
done | |
else | |
echo "pkglocate didn't find a package providing program ${CMD}" | |
fi | |
``` | |
# Configuration | |
Now, we need to configure the shell to run this command when it detects | |
an error corresponding to an unknown command. This is possible with | |
bash, zsh or fish at least. | |
## Bash configuration | |
Let's go with bash, add this to your bash configuration file | |
```bash script | |
command_not_found_handle() | |
{ | |
/usr/local/bin/command-not-found "$1" | |
} | |
``` | |
## Fish configuration | |
```fish shell script | |
function fish_command_not_found | |
/usr/local/bin/command-not-found $argv[1] | |
end | |
``` | |
## ZSH configuration | |
```zsh shell script | |
function command_not_found_handler() | |
{ | |
/usr/local/bin/command-not-found "$1" | |
} | |
``` | |
# Trying it | |
Now that you configured your shell correctly, if you run a command in | |
your shell that isn't available in your PATH, you may have either a | |
success with a list of packages giving the command or that the command | |
can't be found in any package (unlucky). | |
This is a successful output that found the program we were trying to | |
run. | |
```Success output | |
$ pup | |
The following package(s) contain program pup | |
- pup-0.4.0p0 | |
``` | |
This is a result showing that no package found a program named "steam". | |
```Unsuccessful output | |
$ steam | |
pkglocate didn't find a package providing program steam | |
``` |