3 OpenBSD ksh (sometimes called opdksh or oksh) is the default shell on
4 OpenBSD, and is generally my go-to choince on other systems too. It has
5 a good ratio of features and simplicity
7 if [ "$TERM" = dumb ]; then
12 Enable emacs-like command editing regardless of $EDITOR and csh-like
13 history expansion with !
18 Talking about history, by default ksh won't store any, which is
19 unfortunate. I can't live without my C-r working!
21 HISTCONTROL=ignoredups:ignorespace
22 HISTFILE=$HOME/.history
25 OpenBSD ksh has a limited support for programmed completions through
26 static lists. The completions are provided via an array called
27 complete_$progname; or complete_$progname_$nth for the nth argument.
29 Here's the completions for ssh and scp:
31 HOST_LIST=$(awk '/Host / {print $2}' ~/.ssh/config | xargs echo)
33 set -A complete_ssh -- $HOST_LIST
34 set -A complete_scp -- $HOST_LIST
36 and for kill(1) and pkill(1)
38 set -A complete_kill_1 -- -9 -HUP -INFO -KILL -TERM
39 set -A complete_pkill_2 -- -SIGHUP -SIGUSR1 -SIGUSR2 -SIGTERM -SIGKILL
41 and for vmd(8) if available
43 if pgrep -fq /usr/sbin/vmd; then
44 set -A complete_vmctl_1 -- console load reload start stop \
45 reset status send receive
46 set -A complete_vmctl -- \
47 $(vmctl status | awk '!/NAME/{printf "%s ", $NF}')
52 set -A complete_ifconfig_1 -- $(ifconfig | grep ^[a-z] | cut -d: -f1)
56 command -v got >/dev/null && \
57 set -A complete_got_1 -- $(got -h 2>&1 | sed -n s/commands://p)
59 Tweak the output of ls
63 reset(1) doesn't work as expected inside tmux: the old output can still
64 be consulted when scrolling. If I, lazy as I am, bother to type "reset"
65 I want to be sure that the history was cleared!
67 if [ -n "$TMUX" ]; then
68 alias reset='reset && tmux clear-history'
71 CDPATH is super useful! I even wrote a post about it:
72 https://www.omarpolo.com/post/enjoying-cdpath.html
74 export CDPATH=".:$HOME/w:/usr/ports:/usr/ports/mystuff:$HOME/quicklisp/local-projects"
76 I love to hate gpg! It needs some special treatments to work and this
77 should also (finger crossed!) fix pinentry over ssh. I'm not sure it
78 works though, it's been a while since I've connected remotely to my
82 if [ -n "$SSH_CONNECTION" ]; then
83 export PINENTRY_USER_DATA="USE_CURSES=1"
86 The BSDs have this incredibly useful signal available, it's a shame not
91 I really like my prompt to be as minimal as possible. For some time
92 I've used a single colon `;' as prompt, it's really nice! At the moment
93 thought I'm usign a more plan9-esque percent sign:
97 I got tired of trying to remember the set of flags for nc to walk to
98 Gemini servers, so here we are:
100 # "post" stdin to the gemini server
101 # usage: gem host [port]
104 host="${1:?missing host}"
106 nc -c -Tnoverify "${host}" "${port}"
109 I think I've stolen these from someone. It makes a copy of the file and
110 launch an editor on the original file, incledibly useful when working
111 with ports (that's why doas!)
116 printf "%s\n" "USAGE: mgdiff file" >&2
119 doas cp -p "$1" "$1.orig"
123 hist is a quick wrapper around history and grep to quickly search for a
129 printf "%s\n" "USAGE: hist pattern" >&2
132 history 0 | grep "$1"
135 clbin (the site) is a web pastebin that's easy to use from the command
136 line with curl. clbin (the function) is an easy way to share something,
137 just pipe it to clbin and it returns an url.
141 curl -F 'clbin=<-' https://clbin.com
144 Some aliases I use when working with the OpenBSD port tree:
147 alias mup="make update-patches"
148 alias mupl="make update-plist"
149 alias mpldc="make port-lib-depends-check"
150 alias pbuild="env MAKE_JOBS=5 time make"
151 alias build="pbuild 2>&1 | tee build"
152 alias pclean='make clean="package plist"'
154 This one is pretty sophisticated, I've stolen it from jca@
156 # check shared libs version
161 for f in $(make show=SHARED_LIBS); do
162 [ "$((cnt++ % 2))" -eq 1 ] && continue
164 /usr/src/lib/check_sym /usr/local/lib/lib$f.so* \
165 $(make show=WRKINST)/usr/local/lib/lib$f.so*
169 And even more aliases:
171 alias mopnew="mdirs ~/Maildir/op | grep -v emacs | mlist -st | mthread -r | mseq -S"
173 for c in com rep fwd bnc; do
174 alias m$c="VISUAL='mg -f auto-fill-mode' m$c"
175 alias o$c="m$c -from 'Omar Polo <op@openbsd.org>'"
178 And finally some aliases for mq
180 alias pnq="NQDIR=/tmp/ports/ nq "
181 alias pfq="NQDIR=/tmp/ports/ fq "
183 Stuff to use my own purritobin instance
185 : ${P_SERVER=paste.omarpolo.com}
190 shell client to upload a plaintext message
193 curl --silent --max-time "${P_MAXTIME}" \
194 --data-binary "@${1:-/dev/stdin}" \
195 "${P_SERVER}:${P_PORT}/${P_TIME}"
198 shell client to upload an encrypted message
201 key="$(openssl rand -hex 32)"
202 iv="$(openssl rand -hex 16)"
203 url="$(openssl enc -aes-256-cbc -K ${key} -iv ${iv} -e -base64 -A < ${1:-/dev/stdin} | purr)"
204 printf "%s\n" "${url%\/*}/paste.html#${url##*\/}_${key}_${iv}"
214 paste=$(printf '%s\n' "${vals}" | cut -d_ -f1)
215 key=$(printf '%s\n' "${vals}" | cut -d _ -f2)
216 iv=$(printf '%s\n' "${vals}" | cut -d _ -f3)
217 curl --max-time "${P_MAXTIME}" --write-out "\n" --silent \
218 "${baseurl}/${paste}" | openssl enc -aes-256-cbc \
219 -base64 -d -K ${key} -iv ${iv}
220 unset url baseurl vals paste key iv
223 a little awk oneliner to show the stats of a unified diff
229 END { printf("additions:\t%d\nremoval:\t%d\n", a, m) }
233 find(1) is an invaluable tool and I use it all the time. walk is an
234 attempt to build a wrapper around some common usages of find that is a
235 little bit less verbose to use. The name is stolen from 9front, but the
236 implementation is completely different.
238 # usage: walk [dir] [type] [name regexp] [! command to execute]
241 if [ $# -eq 0 ]; then
250 if [ -n "$1" -a -d "$1" ]; then
261 if [ -n "$1" -a "x$1" != "x!" ]; then
266 if [ "x$1" = x! ]; then
270 if [ $# -eq 0 ]; then
271 find "$dir" $type -iname "$name"
273 find "$dir" $type -iname "$name" -exec "$@" {} +