Title : Implement a «Command not found» handler in OpenBSD
Author: Solène
Date : 09 March 2021
Tags : openbsd
# 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
RESULT=$(pkglocate */bin/${CMD} */sbin/${CMD} | cut -d ':' -f 1)
if [ -n "$RESULT" ]
echo "The following package(s) contain program ${CMD}"
for result in $RESULT
echo " - $result"
echo "pkglocate didn't find a package providing program ${CMD}"
# 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
/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]
## 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