Blob


1 # ksh
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
8 PS1='$ '
9 return
10 fi
12 Enable emacs-like command editing regardless of $EDITOR and csh-like
13 history expansion with !
15 set -o emacs
16 set -o csh-history
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
23 HISTSIZE=10000
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}')
48 fi
50 and for ifconfig(8)
52 set -A complete_ifconfig_1 -- $(ifconfig | grep ^[a-z] | cut -d: -f1)
54 and for got(1)
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
61 alias ls='ls -F'
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'
69 fi
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
79 desktop.
81 export GPG_TTY=$(tty)
82 if [ -n "$SSH_CONNECTION" ]; then
83 export PINENTRY_USER_DATA="USE_CURSES=1"
84 fi
86 The BSDs have this incredibly useful signal available, it's a shame not
87 to use it!
89 stty status ^T
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:
95 PS1='% '
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]
102 gem()
104 host="${1:?missing host}"
105 port="${2:-1965}"
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!)
113 mgdiff()
115 if [ -z "$1" ]; then
116 printf "%s\n" "USAGE: mgdiff file" >&2
117 return
118 fi
119 doas cp -p "$1" "$1.orig"
120 doas mg "$1"
123 hist is a quick wrapper around history and grep to quickly search for a
124 previous command:
126 hist()
128 if [ -z "$1" ]; then
129 printf "%s\n" "USAGE: hist pattern" >&2
130 return 1
131 fi
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.
139 clbin()
141 curl -F 'clbin=<-' https://clbin.com
144 Some aliases I use when working with the OpenBSD port tree:
146 alias m="make"
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
157 cshlib() {
158 local cnt=0
159 local f
161 for f in $(make show=SHARED_LIBS); do
162 [ "$((cnt++ % 2))" -eq 1 ] && continue
163 echo '===>' $f
164 /usr/src/lib/check_sym /usr/local/lib/lib$f.so* \
165 $(make show=WRKINST)/usr/local/lib/lib$f.so*
166 done
169 And even more aliases:
171 alias mopnew="mdirs ~/Maildir/op | grep -v emacs | mlist -st | mthread -r | mseq -S; mscan"
173 for c in com rep fwd bnc; do
174 local _mvisual='mg -f auto-fill-mode'
175 if [ -n "$DISPLAY" ]; then
176 _mvisual='emacsclient -c'
177 fi
179 alias m$c="VISUAL='$_mvisual' m$c"
180 alias o$c="m$c -from 'Omar Polo <op@openbsd.org>'"
181 done
183 And finally some aliases for mq
185 alias pnq="NQDIR=/tmp/ports/ nq "
186 alias pfq="NQDIR=/tmp/ports/ fq "
188 Stuff to use my own purritobin instance
190 : ${P_SERVER=paste.omarpolo.com}
191 : ${P_PORT=42069}
192 : ${P_TIME=week}
193 : ${P_MAXTIME=30}
195 shell client to upload a plaintext message
197 purr() {
198 curl --silent --max-time "${P_MAXTIME}" \
199 --data-binary "@${1:-/dev/stdin}" \
200 "${P_SERVER}:${P_PORT}/${P_TIME}"
203 shell client to upload an encrypted message
205 meow() {
206 key="$(openssl rand -hex 32)"
207 iv="$(openssl rand -hex 16)"
208 url="$(openssl enc -aes-256-cbc -K ${key} -iv ${iv} -e -base64 -A < ${1:-/dev/stdin} | purr)"
209 printf "%s\n" "${url%\/*}/paste.html#${url##*\/}_${key}_${iv}"
210 unset key iv url
213 ...and to decrypt it
215 meowd() {
216 url="$1"
217 baseurl="${url%\/*}"
218 vals="${url##*\#}"
219 paste=$(printf '%s\n' "${vals}" | cut -d_ -f1)
220 key=$(printf '%s\n' "${vals}" | cut -d _ -f2)
221 iv=$(printf '%s\n' "${vals}" | cut -d _ -f3)
222 curl --max-time "${P_MAXTIME}" --write-out "\n" --silent \
223 "${baseurl}/${paste}" | openssl enc -aes-256-cbc \
224 -base64 -d -K ${key} -iv ${iv}
225 unset url baseurl vals paste key iv
228 a little awk oneliner to show the stats of a unified diff
230 diffstat() {
231 awk '
232 /^\+/ { a++; next }
233 /^\-/ { m++; next }
234 END { printf("additions:\t%d\nremoval:\t%d\n", a, m) }
238 find(1) is an invaluable tool and I use it all the time. walk is an
239 attempt to build a wrapper around some common usages of find that is a
240 little bit less verbose to use. The name is stolen from 9front, but the
241 implementation is completely different.
243 # usage: walk [dir] [type] [name regexp] [! command to execute]
244 walk()
246 if [ $# -eq 0 ]; then
247 find .
248 return
249 fi
251 local dir=.
252 local type=
253 local name=\*
255 if [ -n "$1" -a -d "$1" ]; then
256 dir="$1"
257 shift
258 fi
260 case "$1" in
261 b|c|d|f|l|p|s)
262 type="-type $1"
263 shift
264 esac
266 if [ -n "$1" -a "x$1" != "x!" ]; then
267 name="$1"
268 shift
269 fi
271 if [ "x$1" = x! ]; then
272 shift
273 fi
275 if [ $# -eq 0 ]; then
276 find "$dir" $type -iname "$name"
277 else
278 find "$dir" $type -iname "$name" -exec "$@" {} +
279 fi