1
0
Fork 0
mirror of https://github.com/notwa/rc synced 2024-11-05 05:49:02 -08:00
rc/README.md

1209 lines
44 KiB
Markdown
Raw Normal View History

2013-06-28 05:51:52 -07:00
## obligatory personal dotfiles repository
2013-06-28 05:22:14 -07:00
_(plus some little shell scripts)_
2024-07-11 21:29:55 -07:00
### quick install
2019-06-03 09:33:02 -07:00
2024-07-11 21:29:55 -07:00
this archive is always up-to-date with git.
```sh
2022-08-29 22:02:44 -07:00
# with curl:
2019-06-03 09:33:02 -07:00
cd && curl -L https://github.com/notwa/rc/archive/master.tar.gz | tar zx && mv rc-master rc && rc/install
2022-08-29 22:02:44 -07:00
# with wget:
cd && wget -O - https://github.com/notwa/rc/archive/master.tar.gz | tar zx && mv rc-master rc && rc/install
2019-06-03 09:33:02 -07:00
```
2024-07-11 21:29:55 -07:00
### experimental install
this archive is only updated once a day.
```sh
# one time:
gpg --locate-key rc@glorp.wang
# many times:
cd && curl rc.glorp.wang | gpg --yes -o rc.tar -d - && tar xf rc.tar && rc/install
```
`curl` can be replaced by `wget -O-` or [`http`][httpie] or even [`burl`](#burl).
note that you can't pipe gpg directly into tar, because
because doing so would skip the signature being checked.
[httpie]: https://httpie.io/docs/cli
2024-07-23 05:51:34 -07:00
### shell compatibility
2024-07-11 21:29:55 -07:00
2021-08-06 08:10:06 -07:00
the following shells are taken into consideration, ordered from most to least compatible:
* zsh
* bash
* dash
* ash (busybox)
2024-07-23 05:51:34 -07:00
refer to the [compatibility table](#compatibility-table) for specifics.
2021-09-22 18:43:23 -07:00
2021-08-01 00:35:56 -07:00
**NOTE:** everything below this line is overwritten and automatically [regenerated.](/regenerate)
2016-06-27 06:02:53 -07:00
<!-- DOCUMENT -->
2021-07-30 17:59:30 -07:00
## shell functions
2024-03-26 15:21:33 -07:00
### [argc](/sh/argc#L4)
2021-08-01 00:38:05 -07:00
2021-08-01 09:27:25 -07:00
validate the number of arguments in a function.
2021-08-06 08:20:02 -07:00
2021-08-01 00:38:05 -07:00
```sh
2021-10-13 23:09:57 -07:00
# usage: myfunc() { argc $# -(eq|le|ge) [0-9] "$0" || return; }
2021-08-01 00:38:05 -07:00
myfunc() {
2021-08-01 02:14:30 -07:00
# use one of the following:
2021-10-13 23:09:57 -07:00
argc $# -eq N "$0" || return
argc $# -le N "$0" || return
argc $# -ge N "$0" || return
2021-08-01 02:14:30 -07:00
# where N is an integer between 0 and 9.
2021-08-01 00:38:05 -07:00
}
```
2024-03-26 15:21:33 -07:00
### [arith](/sh/arith#L7)
2021-07-30 17:59:30 -07:00
perform arithmetic using the shell and display the result.
2021-08-01 09:27:25 -07:00
see also [`hex`](#hex) and [`bin`](#bin).
2021-08-01 09:46:52 -07:00
this example requires zsh:
2021-08-01 09:27:25 -07:00
```
% db=6
% noglob arith 10**(db/20.)
1.9952623149688795
```
2021-07-30 17:59:30 -07:00
2024-07-23 05:53:05 -07:00
### [autosync](/sh/autosync#L7)
2021-07-30 17:59:30 -07:00
combine `inotifywait` and `rsync`.
this is sometimes nicer than `ssh`-ing into a server and running `vim` remotely.
2024-03-26 15:21:33 -07:00
### [bak](/sh/bak#L4)
2021-08-01 00:38:05 -07:00
2021-08-01 09:46:52 -07:00
backup files by creating copies and appending ".bak" to their names.
2021-08-01 09:27:25 -07:00
this calls itself recursively to avoid clobbering existing backups.
```
$ touch -d '2001-12-25 16:30:00' butts
$ bak butts
$ touch butts
$ bak butts
$ ls -l
total 0
-rw-r--r-- 1 notwa None 0 Aug 1 08:02 butts
-rw-r--r-- 1 notwa None 0 Aug 1 08:02 butts.bak
-rw-r--r-- 1 notwa None 0 Dec 25 2001 butts.bak.bak
```
2021-08-01 00:38:05 -07:00
2024-03-26 15:21:33 -07:00
### [baknow](/sh/baknow#L4)
2021-08-01 00:38:05 -07:00
2021-08-23 04:53:27 -07:00
backup files by appending their timestamps given by [`now`.](#now)
2021-08-01 09:27:25 -07:00
```
$ touch -d '2001-12-25 16:30:00' butts
$ baknow butts
$ baknow butts
cp: overwrite 'butts.2001-12-26_01800000.bak'? n
$ ls -l
total 0
-rw-r--r-- 1 notwa None 0 Dec 25 2001 butts
-rw-r--r-- 1 notwa None 0 Dec 25 2001 butts.2001-12-26_01800000.bak
```
2024-03-26 15:21:33 -07:00
### [baks](/sh/baks#L5)
2021-08-01 00:38:05 -07:00
2021-08-01 09:27:25 -07:00
backup files by copying each and appending *the current* date-time,
irrespective of when the files were modified or created.
```
$ touch -d '2001-12-25 16:30:00' butts
$ baks butts
$ baks butts
$ ls -l
total 0
-rw-r--r-- 1 notwa None 0 Dec 25 2001 butts
-rw-r--r-- 1 notwa None 0 Dec 25 2001 butts.21-08-01_14-54-07.bak
-rw-r--r-- 1 notwa None 0 Dec 25 2001 butts.21-08-01_14-54-09.bak
```
2024-03-26 15:21:33 -07:00
### [bin](/sh/bin#L7)
2021-08-01 00:38:05 -07:00
2021-08-01 09:27:25 -07:00
perform arithmetic using the shell and display the result as
an unsigned 8-bit integer in binary.
see also [`arith`](#arith) and [`hex`](#hex).
2021-08-01 00:38:05 -07:00
2021-08-01 09:27:25 -07:00
```
$ bin 123
01111011
```
2021-08-01 00:38:05 -07:00
2024-07-01 22:05:12 -07:00
### [burl](/sh/burl#L4)
turn bash into a makeshift HTTP client.
inspired by [hackshell.sh.](https://thc.org/hs)
also works in most other shells thanks to netcat.
2024-07-04 21:05:49 -07:00
minimal/minified version: https://eaguru.guru/t/burl.sh (469 bytes)
2024-07-01 22:05:12 -07:00
```
$ burl httpbin.org/get
HTTP/1.1 200 OK
Date: Tue, 01 Jul 2024 00:00:00 GMT
Content-Type: application/json
Content-Length: 192
Connection: close
Server: gunicorn/19.9.0
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
{
"args": {},
"headers": {
"Host": "httpbin.org",
"X-Amzn-Trace-Id": "Root=1-12345678-deadfadefeedfacebeefcafe"
},
"origin": "0.0.0.0",
"url": "http://httpbin.org/get"
}
```
2024-03-26 15:21:33 -07:00
### [busiest](/sh/busiest#L4)
2021-07-30 17:59:30 -07:00
2021-09-28 13:42:18 -07:00
list directories in descending order by the number of files in them,
counted recursively.
2021-07-30 17:59:30 -07:00
2021-08-01 09:27:25 -07:00
```
2021-09-28 13:42:18 -07:00
$ cd && busiest | head -n3
144181 src
48840 work
21042 play
2021-08-01 09:27:25 -07:00
```
2024-07-01 22:12:25 -07:00
### [clash](/sh/clash#L4)
2024-07-21 22:35:14 -07:00
run a command through 12 different shells.
2024-07-01 22:12:25 -07:00
only returns false when no arguments are given.
2024-03-26 15:21:33 -07:00
### [colors](/sh/colors#L4)
2021-07-30 17:59:30 -07:00
2021-08-01 09:27:25 -07:00
display all combinations of foreground and background terminal colors.
this only includes the basic 16-color palette.
2024-07-12 06:52:24 -07:00
excluding boilerplate, this script is a mere 67 characters long!
2021-07-30 17:59:30 -07:00
2024-07-12 06:52:24 -07:00
![terminal colors](https://eaguru.guru/t/terminal-colors-2024.png)
2021-08-01 09:27:25 -07:00
2024-03-26 15:21:33 -07:00
### [setup_clang_ubuntu (sh/compile)](/sh/compile#L4)
2021-08-01 09:27:25 -07:00
print (but don't execute) the commands necessary to install
a fairly recent version of clang on ubuntu-based distros.
2021-07-30 17:59:30 -07:00
2021-08-01 09:27:25 -07:00
```sh
2024-07-12 06:52:24 -07:00
$ setup_clang_ubuntu noble
wget -O- http://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add -
echo > "/etc/apt/sources.list.d/llvm-toolchain-noble.list" \
"
deb http://apt.llvm.org/noble/ llvm-toolchain-noble main
# deb-src http://apt.llvm.org/noble/ llvm-toolchain-noble main
# 18
deb http://apt.llvm.org/noble/ llvm-toolchain-noble-18 main
# deb-src http://apt.llvm.org/noble/ llvm-toolchain-noble-18 main"
export DEBIAN_FRONTEND=noninteractive NEEDRESTART_SUSPEND=1
apt-get update -y && apt-get install -y clang-18 lld-18
update-alternatives --install /usr/bin/clang clang /usr/bin/clang-18 1800
update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-18 1800
update-alternatives --install /usr/bin/llvm-symbolizer llvm-symbolizer /usr/bin/llvm-symbolizer-18 1800
2021-08-01 09:27:25 -07:00
```
2021-07-30 17:59:30 -07:00
2024-03-26 15:21:33 -07:00
### [compile](/sh/compile#L47)
2021-07-30 17:59:30 -07:00
compile single-file C and C++ programs, messily.
supports gcc and clang on \*nix, and mingw64 gcc, msvc clang,
and regular msvc on Windows. tested on x86\_64 and on ARMv7 as well.
does not support MacOS, maybe someday…
defaults to gnu11 and gnu++1z as C and C++ standards respectively.
defaults to clang, gcc, and msvc in that order.
`compile` attempts to guess the most sane switches for any program, so that compilation may reduce to:
2021-08-01 09:27:25 -07:00
```sh
# debug build
compile rd.c
compile debug rd.c
2021-10-29 06:46:21 -07:00
# debug build with warning/error flags defined in ~/sh/arrays
2021-08-01 09:27:25 -07:00
# (requires .zshrc for global alias expansion)
compile WHOA rd.c
# likewise for C++
compile WHOA WELP rd.cc
compile WHOA WELP rd.cpp
# "derelease" build (release build with debug information)
compile derelease WHOA rd.c
# release build (with symbols stripped)
compile release WHOA rd.c
# hardened build (only useful on *nix)
compile hardened WHOA rd.c
# specifying compiler
compile gcc WHOA rd.c
compile msvc WHOA rd.c
compile release clang WHOA rd.c
# compile and execute (FIXME: writing to /tmp is a security concern)
compile derelease rd.c && /tmp/rd
```
2021-07-30 17:59:30 -07:00
2024-03-26 15:21:33 -07:00
### [confirm](/sh/confirm#L4)
2021-07-30 17:59:30 -07:00
display a simple yes-or-no prompt and return 0-or-1 respectively.
```
$ confirm && echo yay || echo nay
Continue? [y/N] y
yay
$ confirm && echo yay || echo nay
Continue? [y/N] n
nay
```
2021-08-01 09:46:52 -07:00
a real world example:
```
2021-09-25 00:33:52 -07:00
$ g1 && confirm && git commit -a --amend --no-edit
2021-08-01 09:46:52 -07:00
daf84e3 document a ton of stuff
Continue? [y/N] y
[master 92bdf76] document a ton of stuff
Date: Sun Aug 1 09:27:25 2021 -0700
20 files changed, 406 insertions(+), 29 deletions(-)
```
2024-03-26 15:21:33 -07:00
### [countdiff](/sh/countdiff#L4)
2021-08-01 00:38:05 -07:00
2021-08-01 09:27:25 -07:00
count the number of lines changed between two files.
**TODO:** don't use git for this. also, use patience algorithm.
```
$ countdiff README-old.md README.md
739
```
2021-08-01 00:38:05 -07:00
2024-03-26 15:21:33 -07:00
### [days](/sh/days#L4)
2021-07-30 17:59:30 -07:00
2021-08-01 00:38:05 -07:00
compute the number of days since a given date.
2021-07-30 17:59:30 -07:00
```
$ days 'January 1 1970'
18838
```
2024-07-23 05:53:05 -07:00
### [decently](/sh/decently#L4)
2021-10-01 10:32:17 -07:00
given a list of directories, update the last-modified timestamp
of each argument to that of the most recent file that it contains.
note that *files* are found recursively, but only the
*outermost directory* (the one specified by argument)
has its timestamp updated. symlinks are followed.
`.git` subdirectories are skipped over.
the timestamps of subdirectories are ignored.
2024-07-05 17:55:47 -07:00
### [dedupe](/sh/dedupe#L4)
copy a directory, but make hard/softlinks for identical files.
2024-03-26 15:21:33 -07:00
### [dfu](/sh/dfu#L4)
2021-07-30 17:59:30 -07:00
pretty-print `df` in GiB.
2021-08-01 09:27:25 -07:00
```
$ dfu
Filesystem Used Max Left Misc
/dev 0.00 0.46 0.46 0.00
/ 17.20 23.22 6.01 1.27
```
2021-07-30 17:59:30 -07:00
2024-03-26 15:21:33 -07:00
### [disowned](/sh/disowned#L4)
2021-09-30 08:57:57 -07:00
find files in system directories that aren't associated with any pacman packages.
2022-03-06 14:33:18 -08:00
### [document](/sh/document#L147)
2021-08-01 00:38:05 -07:00
generate a markdown file out of docstrings in shell scripts.
**TODO:** describe. i have a rough outline written in my scrap file.
2024-03-26 15:21:33 -07:00
### [e](/sh/e#L4)
2021-07-30 17:59:30 -07:00
wrap around `$EDITOR` to run it as root if necessary.
this still needs some work to detect root-owned directories.
```
$ e /etc/sudoers
[sudo] password for notwa:
```
2021-10-14 00:08:55 -07:00
**NOTE:** there also exists an e(1) program provided by
the *e-wrapper* package that i don't use.
2024-03-26 15:21:33 -07:00
### [ea](/sh/ea#L24)
2021-08-01 00:38:05 -07:00
2021-08-01 10:29:45 -07:00
**TODO:** document.
2021-08-01 00:38:05 -07:00
2024-03-26 15:21:33 -07:00
### [echo2](/sh/echo2#L4)
2021-08-01 00:38:05 -07:00
2021-08-01 09:27:25 -07:00
print arguments joined by spaces to stderr without parsing anything.
```
$ echo -e 'this\nthat' those
this
that those
$ echo2 -e 'this\nthat' those
-e this\nthat those
```
2021-08-01 00:38:05 -07:00
2024-03-26 15:21:33 -07:00
### [explore](/sh/explore#L4)
2021-08-01 00:38:05 -07:00
2021-08-01 09:27:25 -07:00
open a single directory in `explorer.exe`, defaulting to `$PWD`.
2021-08-01 00:38:05 -07:00
2024-07-05 05:11:19 -07:00
### [feud](/sh/feud#L4)
parse command-line arguments, mapping short-flags to variable names.
**NOTE:** the API is still experimental and will undergo major changes.
2024-03-26 15:21:33 -07:00
### [ff](/sh/ff#L4)
2021-08-01 00:38:05 -07:00
2021-08-02 06:50:53 -07:00
select a file from a given or current directory using
[`fzy`.](https://github.com/jhawthorn/fzy)
2021-08-01 00:38:05 -07:00
2024-03-26 15:21:33 -07:00
### [ghmd](/sh/ghmd#L7)
2021-08-01 00:38:05 -07:00
2021-08-01 09:27:25 -07:00
convert a markdown file to HTML in the style of GitHub.
note that this uses GitHub's API, so it requires internet connectivity.
this script utilizes the CSS provided at
[sindresorhus/github-markdown-css.](https://github.com/sindresorhus/github-markdown-css)
2021-08-01 00:38:05 -07:00
2021-08-01 09:46:52 -07:00
```
~/sh/ghmd < ~/rc/README.md > ~/rc/README.html
```
2024-07-23 05:53:05 -07:00
### [grab](/sh/grab#L5)
2024-03-04 09:19:14 -08:00
download a file from my site and verify its integrity by its [minisign](https://github.com/jedisct1/minisign/) signature.
2024-03-26 15:21:33 -07:00
### [grop](/sh/grop#L5)
2022-09-01 18:30:35 -07:00
invoke grep with `-oP`.
**NOTE:** there also exists a grop(1) program provided by
the *grop* package that i don't use.
2024-03-26 15:21:33 -07:00
### [grop4](/sh/grop4#L4)
2022-09-01 18:30:35 -07:00
[`grop`](#grop) for IPv4s.
2024-03-26 15:21:33 -07:00
### [has](/sh/has#L4)
2021-07-30 17:59:30 -07:00
2021-10-14 14:10:43 -07:00
[`have`,](#have) silently.
2024-03-26 15:21:33 -07:00
### [have](/sh/have#L4)
2021-10-14 14:10:43 -07:00
2021-07-30 17:59:30 -07:00
print the result of `which` if the program is found, else simply return 1.
2021-08-01 09:46:52 -07:00
```
2021-10-14 14:10:43 -07:00
export SOLVER="$(have kissat || have picosat || have cadical || have minisat)"
2021-08-01 09:46:52 -07:00
```
2021-07-30 17:59:30 -07:00
2024-03-26 15:21:33 -07:00
### [hex](/sh/hex#L7)
2021-07-30 17:59:30 -07:00
2021-08-01 09:27:25 -07:00
perform arithmetic using the shell and display the result as
an unsigned 32-bit integer in hexadecimal.
see also [`arith`](#arith) and [`bin`](#bin).
```
$ hex 0x221EA8-0x212020
0000FE88
```
2021-07-30 17:59:30 -07:00
2021-08-02 06:50:53 -07:00
**NOTE:** there also exists a hex(1) program provided by
the *basez* package that i don't use.
2024-03-26 15:21:33 -07:00
### [ify](/sh/ify#L4)
2021-07-30 17:59:30 -07:00
pipe one command through another, so you can still pass arguments to the former.
this is mainly useful for aliases. 99% of the time you'll use this with `less`.
```
$ alias ll="ify less ls -ACX --group-directories-first --color=force"
$ ll /etc
```
2024-03-26 15:21:33 -07:00
### [is_empty](/sh/is_empty#L4)
2021-07-30 17:59:30 -07:00
return 0 if the directory given by argument is empty.
2024-03-26 15:21:33 -07:00
### [isup](/sh/isup#L4)
2021-07-30 17:59:30 -07:00
return 0 if a given website returns a 2xx HTTP code.
2021-08-02 06:50:53 -07:00
```
$ isup google.com && echo yay || echo nay
yay
$ isup fdhafdslkjgfjs.com && echo yay || echo nay
nay
```
2024-03-26 15:21:33 -07:00
### [join2](/sh/join2#L4)
2022-09-30 16:51:09 -07:00
join every other line.
2024-03-26 15:21:33 -07:00
### [lsarchive](/sh/lsarchive#L4)
2021-10-14 14:10:43 -07:00
list the contents of an archive file in one of many formats.
borrowed from [prezto.](https://github.com/sorin-ionescu/prezto)
2024-03-26 15:21:33 -07:00
### [maybesudo](/sh/maybesudo#L4)
2021-08-01 00:38:05 -07:00
2021-08-01 09:27:25 -07:00
mimic certain features of `sudo` for systems without it installed.
as it stands, this mostly just handles some environment variables.
2021-08-01 00:38:05 -07:00
2024-07-21 22:07:19 -07:00
try this: `maybesudo -u "$USER" printenv`
2021-08-01 09:46:52 -07:00
2024-03-26 15:21:33 -07:00
### [minutemaid](/sh/minutemaid#L4)
2021-07-30 17:59:30 -07:00
2021-09-29 07:51:51 -07:00
check if the current minute is divisible by a given number,
and optionally execute a command if it is. if a command is given,
either execute the command and return its exit value,
or execute nothing and return 0. if a command is omitted,
either return 0 on the minute, or return 1.
note that a "minute" is relative to the seconds since the epoch,
not the minute of the hour. this ensures that commands will run
roughly every N minutes, regardless of the minute hand on the clock.
note that `minutemaid 1` will always return 0,
and `minutemaid 1 command` will always execute the command,
since every integral interval is evenly divisible by 1.
`minutemaid 0`, and any negative interval, is an error.
2021-07-30 17:59:30 -07:00
```
# crontab usage:
* * * * * minutemaid 9 ~/work/do_my_bidding # runs every nine minutes
2021-09-29 07:51:51 -07:00
# loop usage:
until minutemaid 9; do sleep 5; done
echo the wait is finally over; date
# improper usage:
while minutemaid 1; do sleep 1; done
echo this will never happen
2021-07-30 17:59:30 -07:00
```
2024-03-26 15:21:33 -07:00
### [monitor](/sh/monitor#L4)
2021-07-30 17:59:30 -07:00
2021-08-01 09:27:25 -07:00
this is [watch(1)](https://www.man7.org/linux/man-pages/man1/watch.1.html)
loosely reimplemented as a shell script.
2021-08-01 09:46:52 -07:00
```
usage: monitor [-fs] [-n {period}] {command} [{args...}]
```
2021-07-30 17:59:30 -07:00
2021-08-02 06:50:53 -07:00
**NOTE:** there also exists monitor(1) programs provided by
the *389-ds-base* and *dmucs* packages that i don't use.
2024-03-26 15:21:33 -07:00
### [morecolors](/sh/morecolors#L4)
2021-10-01 06:06:38 -07:00
print all 256 colors that are available on most terminals.
2024-03-26 15:21:33 -07:00
### [noccom](/sh/noccom#L6)
2021-07-30 17:59:30 -07:00
strip C-like comments; both multi-line and single-line.
2024-03-26 15:21:33 -07:00
### [note](/sh/note#L4)
2021-08-01 00:38:05 -07:00
2021-08-01 09:27:25 -07:00
act like [`echo2`,](#echo2) but use a bright color to stand out more.
2021-08-01 00:38:05 -07:00
2021-08-02 06:50:53 -07:00
**NOTE:** there also exists a [note(1)](https://www.daemon.de/projects/note/)
program provided by the *note* package that i don't use.
2024-03-26 15:21:33 -07:00
### [now](/sh/now#L4)
2021-07-30 17:59:30 -07:00
print a date-time (UTC) in a sortable format.
this takes a date or file as an argument,
else it defaults to the current time.
```
$ now
2019-05-27_35083906
$ now ~/sh/monitor
2017-03-14_82387259
$ now '@1234567890'
2009-02-13_84690000
```
2024-03-26 15:21:33 -07:00
### [oshi](/sh/oshi#L4)
2024-03-21 06:38:52 -07:00
upload files (or stdin) to [oshi.at.](https://oshi.at)
this script exits with the number of failed uploads; up to 255 at once.
directories are skipped. for now, file expiry is hard-coded at 2 weeks.
```
$ echo test | oshi
MANAGE: https://oshi.at/a/7809e5e8a8b5c28555b1e8cadc99b069d08a5d09
DL: https://oshi.at/ReTn/Dxzy
$ oshi ~/play/{hey,you,fake,empty}
MANAGE: https://oshi.at/a/9b56e4c5843006d491fabe859ea5746a8f36760c
DL: https://oshi.at/obFf/hey
oshi: expires in 14 days: /home/notwa/play/hey
MANAGE: https://oshi.at/a/f2dc46ae900ca7465a377d7a7942e722f87ff483
DL: https://oshi.at/JLBc/you
oshi: expires in 14 days: /home/notwa/play/you
oshi: no such file: /home/notwa/play/fake
oshi: skipping directory: /home/notwa/play/empty
oshi: successfully uploaded 2/4 files
oshi: failed to upload 2/4 files
```
2024-03-26 15:21:33 -07:00
### [oxo](/sh/oxo#L14)
2021-09-15 22:03:42 -07:00
upload files (or stdin) to [0x0.st.](https://0x0.st)
this script exits with the number of failed uploads; up to 255 at once.
file retention period (30 to 365 days) is only computed for arguments.
directories are skipped. please review the terms of service
[on the website](https://0x0.st) before uploading files.
```
$ echo test | oxo
https://0x0.st/sj2.txt
2021-09-28 13:42:18 -07:00
oxo: successfully uploaded 1/1 file
2023-07-06 02:24:19 -07:00
2021-09-15 22:03:42 -07:00
$ oxo ~/play/{hey,you,fake,empty}
https://0x0.st/-3rz.txt
2021-09-15 23:03:46 -07:00
oxo: expires in 365 days: /home/notwa/play/hey
2021-09-15 22:03:42 -07:00
https://0x0.st/-3ri.txt
2021-09-15 23:03:46 -07:00
oxo: expires in 365 days: /home/notwa/play/you
2021-09-15 22:03:42 -07:00
oxo: no such file: /home/notwa/play/fake
oxo: skipping empty file: /home/notwa/play/empty
2021-09-28 13:42:18 -07:00
oxo: successfully uploaded 2/4 files
oxo: failed to upload 2/4 files
2021-09-15 22:03:42 -07:00
```
2024-03-26 15:21:33 -07:00
### [pacbm](/sh/pacbm#L6)
2021-07-30 17:59:30 -07:00
2021-08-01 09:27:25 -07:00
display and order installed pacman packages by their filesize ascending,
and their sum. requires `expac`.
2021-07-30 17:59:30 -07:00
```
$ pacbm | head -n -1 | tail -2
2021-08-01 02:14:30 -07:00
204.78M clang
235.44M linux-firmware
2021-07-30 17:59:30 -07:00
```
2024-03-26 15:21:33 -07:00
### [pause](/sh/pause#L4)
2021-07-30 17:59:30 -07:00
2021-08-01 09:27:25 -07:00
pause — the companion script of [`confirm`.](#confirm)
2021-07-30 17:59:30 -07:00
```
$ pause
Press any key to continue
$
```
2024-03-26 15:21:33 -07:00
### [pegg](/sh/pegg#L4)
2021-08-01 00:38:05 -07:00
2021-08-01 09:27:25 -07:00
download and (pip) install a Python "egg" from a project on GitHub,
defaulting to the master branch. this uses [`pippy`](#pippy) internally.
```sh
# install the development version of https://github.com/rthalley/dnspython
$ pegg rthalley dnspython
# or instead install the latest stable version (as of writing)
$ pegg rthalley dnspython 3933b49
```
2021-08-01 00:38:05 -07:00
2024-07-16 23:54:08 -07:00
### [permit](/sh/permit#L13)
2024-07-10 18:12:36 -07:00
conditionally set executable permissions on each of its arguments.
flags:
* `-a` -- automatic: skip any files whose contents do not begin with
with one of several signatures. this does not affect directories.
2024-07-16 23:54:08 -07:00
* `-m` -- manual: turn off automatic mode. (default)
2024-07-10 18:12:36 -07:00
* `-e` -- everything: consider both regular files and directories. (default)
* `-f` -- files: skip any arguments that are not regular files.
* `-d` -- directories: skip any arguments that are not directories.
2024-07-16 23:54:08 -07:00
* `-n` -- dry-run: don't actually change anything.
* `-v` -- verbose: print changes before doing them.
2024-07-10 18:12:36 -07:00
the `-e`, `-f`, and `-d` flags all override one another, and any of them
can be combined with `-a`. arguments that are neither regular files nor
directories (such as symlinks) are always skipped. arguments that are
already executable by the current user are skipped. arguments that do
not appear to refer to an existing file are passed through to chmod.
directories are never recursed.
2024-03-26 15:21:33 -07:00
### [pippy](/sh/pippy#L4)
2021-08-01 00:38:05 -07:00
2021-08-01 09:27:25 -07:00
install Python packages using pip,
but only update their dependencies as required.
2024-03-21 14:40:13 -07:00
this uses [`maybesudo`](#maybesudo) internally.
2021-08-01 00:38:05 -07:00
2024-03-26 15:21:33 -07:00
### [pre](/sh/pre#L4)
2021-07-30 17:59:30 -07:00
dump all the `#define`s that `$CC $CPPFLAGS $CFLAGS $LDFLAGS` would result in.
2021-08-01 09:27:25 -07:00
```
$ pre | shuf | head -n10
#define __GNUC_MINOR__ 3
#define __SIZEOF_LONG__ 4
#define __UINT_LEAST16_TYPE__ short unsigned int
#define __ORDER_BIG_ENDIAN__ 4321
#define __SIZEOF_FLOAT__ 4
#define __INTMAX_MAX__ 0x7fffffffffffffffLL
#define __INT64_C(c) c ## LL
#define __UINT16_MAX__ 0xffff
#define __DEC64_MANT_DIG__ 16
#define __DBL_HAS_INFINITY__ 1
```
2021-07-30 17:59:30 -07:00
2021-10-14 14:30:44 -07:00
### [preload](/sh/preload#L7)
2021-08-02 14:09:31 -07:00
handle dependencies within the [`~/sh/`](/sh) directory.
2021-08-06 08:20:02 -07:00
2021-08-02 14:09:31 -07:00
this function contains more comments than code, so you should read it.
2024-03-26 15:21:33 -07:00
### [psbm](/sh/psbm#L4)
2021-08-01 00:38:05 -07:00
2021-08-01 09:27:25 -07:00
display and order processes by their memory usage ascending, and their sum.
```
$ psbm | head -n -1 | tail -2
185.08M 1163 chromium
199.95M 1060 chromium
```
2021-08-01 00:38:05 -07:00
2024-03-26 15:21:33 -07:00
### [randir](/sh/randir#L6)
2021-07-30 17:59:30 -07:00
display a random directory in the current working directory.
```
$ randir
./sh
```
2024-03-26 15:21:33 -07:00
### [rot13](/sh/rot13#L6)
2021-08-02 06:50:53 -07:00
rot13 with numbers rotated as well.
```
$ rot13 <<< abc123
nop678
```
**NOTE:** there also exists rot13(1) programs provided by
the *bsdgames* and *hxtools* packages that i don't use.
2024-03-26 15:21:33 -07:00
### [rs](/sh/rs#L4)
2021-07-30 17:59:30 -07:00
record screen. does not record audio.
currently only works on Windows (gdigrab).
i'm sure there's something equivalent for Linux.
2021-08-02 06:50:53 -07:00
**TODO:** consider renaming because rs(1) already exists.
2024-03-26 15:21:33 -07:00
### [running](/sh/running#L6)
2021-10-11 15:13:18 -07:00
WIP
2024-03-26 15:21:33 -07:00
### [scount](/sh/scount#L4)
2022-09-01 18:30:35 -07:00
2022-09-01 18:44:45 -07:00
perform `sort | uniq -c | sort -n`, preferring GNU awk when available.
2022-09-01 18:30:35 -07:00
2024-03-26 15:21:33 -07:00
### [scramble](/sh/scramble#L6)
2021-07-30 17:59:30 -07:00
scrambles text in a predictable way using regex.
sacbremls ttex in a pdrceailtbe way unsig reegx.
2021-08-02 06:50:53 -07:00
**TODO:** consider renaming because scramble(1) already exists.
2024-03-26 15:21:33 -07:00
### [scropt](/sh/scropt#L4)
2021-07-30 17:59:30 -07:00
run `scrot` through `optipng` and save the result to `~/play/$(now).png`.
2024-03-26 15:21:33 -07:00
### [shcom](/sh/shcom#L4)
2021-08-02 23:32:30 -07:00
comment out text from stdin and wrap it in a markdown blockquote
for docstrings. this contains some extra logic for
handling already-commented and already-quoted text.
this allows `shcom` to be used with vim's visual selections
to update existing code examples.
as a simple example, `echo hey | shcom` produces, verbatim:
```
hey
```
2021-10-29 07:22:53 -07:00
### [shelly](/sh/shelly#L2)
(perl 5) invoke the first shell found from a list of shells
as an interactive, non-login shell. arguments are ignored.
2024-03-26 15:21:33 -07:00
### [similar](/sh/similar#L4)
2021-08-01 00:38:05 -07:00
2021-08-01 09:27:25 -07:00
highlight adjacent lines up to the first inequivalent character.
2021-08-01 00:38:05 -07:00
2024-03-26 15:21:33 -07:00
### [slit](/sh/slit#L6)
2021-07-30 17:59:30 -07:00
view specific columns of text.
2024-03-26 15:21:33 -07:00
### [slitt](/sh/slitt#L6)
2021-07-30 17:59:30 -07:00
view specific columns of text.
this version of `slit` uses tabs for its field separators.
2024-03-26 15:21:33 -07:00
### [sortip](/sh/sortip#L4)
2021-08-23 04:53:27 -07:00
sort lines numerically by IPv4 segments.
2024-03-26 15:21:33 -07:00
### [sram](/sh/sram#L4)
2021-07-30 17:59:30 -07:00
convert between a couple saveram formats for N64 emulators.
2024-03-26 15:21:33 -07:00
### [stfu](/sh/stfu#L4)
2021-08-01 00:38:05 -07:00
2021-08-01 09:27:25 -07:00
invoke a command, silencing stdout and stderr *unless* the command fails.
**NOTE:** don't use `stfu` for handling sensitive data or commands!
use it for 7zip.
2021-08-02 23:32:30 -07:00
note that the tail commands in the example below are from `stfu` itself;
they are echoed to reveal the temp paths for any further investigation.
2021-08-01 09:27:25 -07:00
```
$ touch butts
2021-08-02 23:32:30 -07:00
$ STFU_TAIL=5
2021-08-01 09:27:25 -07:00
$ stfu 7z a butts.7z butts
$ stfu 7z a butts.7z asses
command failed with exit status 1:
7z a butts.7z asses
2021-08-02 23:32:30 -07:00
$ tail -n 5 /tmp/stfu.CoJ0vmJsqA/out_1627942118
2021-08-01 09:27:25 -07:00
Scan WARNINGS for files and folders:
asses : The system cannot find the file specified.
----------------
Scan WARNINGS: 1
2021-08-02 23:32:30 -07:00
$ tail -n 5 /tmp/stfu.CoJ0vmJsqA/err_1627942118
2021-08-01 09:27:25 -07:00
WARNING: The system cannot find the file specified.
asses
2021-08-02 23:32:30 -07:00
2021-08-01 09:27:25 -07:00
```
2021-08-01 00:38:05 -07:00
2024-07-05 15:16:26 -07:00
### [subdue](/sh/subdue#L4)
reconfigure your terminal's color scheme using a preset for [recolor.](#recolor)
2024-03-26 15:21:33 -07:00
### [sum](/sh/sum#L4)
2021-08-01 00:38:05 -07:00
2021-08-01 09:27:25 -07:00
compute the summation of its arguments without forking processes.
this relies on the shell's built-in arithmetic operators.
```
$ sum 1 2 3
6
```
**TODO:** consider renaming because sum(1) already exists.
2021-08-01 00:38:05 -07:00
2024-03-26 15:21:33 -07:00
### [sv](/sh/sv#L4)
2021-07-30 17:59:30 -07:00
collect the lastmost value of every key.
2021-08-01 09:27:25 -07:00
the field separator can be given as its sole argument,
it defaults to a single space otherwise.
```
$ echo "alpha=first\nbeta=second\nalpha=third" | sv =
alpha=third
beta=second
```
this next example uses `sv` to only print the lastmost line
matching a pattern in each file. in other words, it uses
the filename printed by grep as the key in its key-value pairs.
2021-07-30 17:59:30 -07:00
```
2021-08-01 09:27:25 -07:00
$ cd ~/play/hash && grep -r 'ing$' . | sv :
./dic_win32.txt:WriteProfileString
./cracklib-small.txt:zoning
./english-words.txt:zooming
./usernames-125k.txt:flats_gaming
./cain.txt:zoografting
./pokemon.txt:Fletchling
./pokemon8.txt:Fletchling
2021-07-30 17:59:30 -07:00
```
2021-08-01 09:27:25 -07:00
**TODO:** rename because busybox(1) sv already exists.
2021-07-30 17:59:30 -07:00
2024-03-26 15:21:33 -07:00
### [trash](/sh/trash#L4)
2021-08-01 00:38:05 -07:00
2021-08-01 09:27:25 -07:00
output a given number of bytes from `/dev/random`.
```
2021-08-01 11:04:27 -07:00
$ trash 10 | xxp
3A A5 4F C7 6D 89 E7 D7 F7 0C
2021-08-01 09:27:25 -07:00
```
2021-08-01 00:38:05 -07:00
2021-10-14 00:08:55 -07:00
**TODO:** consider renaming because trash(1) already exists.
2024-03-26 15:21:33 -07:00
### [trunc](/sh/trunc#L4)
2021-07-30 17:59:30 -07:00
truncate text to fit within your terminal using the unicode character `…`.
2021-08-01 09:27:25 -07:00
```
$ echo $COLUMNS
84
$ seq 1 100 | tr '\n' ' ' | trunc
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31…
```
2024-03-26 15:21:33 -07:00
### [unarchive](/sh/unarchive#L4)
2021-10-14 14:10:43 -07:00
extract the contents of an archive file in one of many formats.
borrowed from [prezto.](https://github.com/sorin-ionescu/prezto)
2024-03-26 15:21:33 -07:00
### [unwrap](/sh/unwrap#L4)
2022-09-30 16:51:09 -07:00
join paragraphs into one line each.
2024-03-26 15:21:33 -07:00
### [v_lower](/sh/v_lower#L4)
2021-10-29 06:14:36 -07:00
transform the contents of a variable to lowercase.
2024-03-26 15:21:33 -07:00
### [v_upper](/sh/v_upper#L4)
2021-10-29 06:14:36 -07:00
transform the contents of a variable to uppercase.
2024-03-26 15:21:33 -07:00
### [wat](/sh/wat#L6)
2021-08-01 00:38:05 -07:00
2021-08-01 09:27:25 -07:00
wat — a better and recursive which/whence. for zsh only.
written by [leah2.](https://leahneukirchen.org/)
2021-08-01 00:38:05 -07:00
2024-03-26 15:21:33 -07:00
### [wipe](/sh/wipe#L4)
2021-07-30 17:59:30 -07:00
clear the screen and its scrollback, then print a high-contrast horizontal line.
using this, you'll know with absolute certainty that you're looking at the top of your history,
and that your terminal's scrollback didn't cap out and eat text.
**TODO:** rename because wipe(1) already exists.
2024-07-13 02:18:01 -07:00
### [witch](/sh/witch#L3)
this is a personal rewrite of `which` from Debian.
the original version didn't run on certain shells,
and inherited inconsistent behaviors from getopts.
2024-07-13 02:57:34 -07:00
the silent (`-s`) flag from Ubuntu has been added.
2024-07-13 02:18:01 -07:00
2024-03-26 15:21:33 -07:00
### [xxp](/sh/xxp#L4)
2021-08-01 10:44:56 -07:00
act like `xxd -p`, but nicely formatted.
**TODO:** support `-r` (reverse) argument.
```
$ xxd -p ~/rc/install | head -n2
23212f7573722f62696e2f656e762073680a232074686973207363726970
7420697320636f6d70617469626c65207769746820666f6c6c6f77696e67
$ xxp ~/rc/install | head -n2
23 21 2F 75 73 72 2F 62 69 6E 2F 65 6E 76 20 73
68 0A 23 20 74 68 69 73 20 73 63 72 69 70 74 20
```
2021-07-30 17:59:30 -07:00
## miscellaneous
2024-07-21 13:39:29 -07:00
### [dummy (zshrc)](/home/zshrc#L64)
2021-08-02 14:09:31 -07:00
return 0, ignoring arguments.
2024-07-21 13:39:29 -07:00
### [dirprev (zshrc)](/home/zshrc#L66)
2021-07-30 17:59:30 -07:00
rotate and change to the previous directory in the directory stack
without consuming the prompt.
2024-07-21 13:39:29 -07:00
### [dirnext (zshrc)](/home/zshrc#L73)
2021-07-30 17:59:30 -07:00
rotate and change to the next directory in the directory stack
without consuming the prompt.
2024-07-21 13:39:29 -07:00
### [dirup (zshrc)](/home/zshrc#L80)
2021-07-30 17:59:30 -07:00
change to the parent directory of the current working directory
without consuming the prompt.
2024-07-21 13:39:29 -07:00
### [dirview (zshrc)](/home/zshrc#L87)
2021-07-30 17:59:30 -07:00
use a fuzzy finder to select a recent directory in the directory stack
and change to it without consuming the prompt.
2024-07-21 13:39:29 -07:00
### [OMFG (zshrc)](/home/zshrc#L192)
2021-07-30 17:59:30 -07:00
silence stdout.
2024-07-21 13:39:29 -07:00
### [STFU (zshrc)](/home/zshrc#L193)
2021-07-30 17:59:30 -07:00
silence stderr.
2024-07-21 13:39:29 -07:00
### [SWAP (zshrc)](/home/zshrc#L194)
2024-06-17 20:58:40 -07:00
swap stdout and stderr. uses fd 3 as an intermediary.
2024-07-21 13:39:29 -07:00
### [WHOA (zshrc)](/home/zshrc#L195)
2021-07-30 17:59:30 -07:00
expand to several C/C++ flags to ease development.
2024-07-21 13:39:29 -07:00
### [WHEE (zshrc)](/home/zshrc#L196)
2021-12-02 13:07:11 -08:00
WHOA but for C++ (specifically g++) only.
2024-07-21 13:39:29 -07:00
### [WELP (zshrc)](/home/zshrc#L197)
2021-07-30 17:59:30 -07:00
expand to C++ flags to enable a C++-as-C facade.
2024-07-21 13:39:29 -07:00
### [reload (zshrc)](/home/zshrc#L246)
2021-07-30 17:59:30 -07:00
reload zsh by wiping temp files, recompiling rc files,
and replacing the current process with a new zsh process.
2024-07-21 13:39:29 -07:00
### [dummy (bashrc)](/home/bashrc#L40)
2021-08-02 14:09:31 -07:00
return 0, ignoring arguments.
2024-07-21 13:39:29 -07:00
### [reload (bashrc)](/home/bashrc#L43)
2021-07-30 17:59:30 -07:00
**TODO:** respect initctl like in `.zshrc`.
2024-07-21 22:07:19 -07:00
### [ADDPATH (shrc)](/home/shrc#L36)
2021-07-30 17:59:30 -07:00
append a directory to `$PATH` if it isn't already present.
2024-07-21 22:07:19 -07:00
### [refresh (shrc)](/home/shrc#L113)
2024-03-21 13:58:30 -07:00
invoke `hash -r`.
2024-07-21 22:07:19 -07:00
### [pl (shrc)](/home/shrc#L116)
2021-07-30 17:59:30 -07:00
2024-02-24 08:42:38 -08:00
print each argument on its own line.
2021-07-30 17:59:30 -07:00
2024-07-21 22:07:19 -07:00
### [ll (shrc)](/home/shrc#L119)
2021-07-30 17:59:30 -07:00
2024-02-24 08:42:38 -08:00
list files verbosely, fancily, ordered, but not recursively.
2021-07-30 17:59:30 -07:00
2024-07-21 22:07:19 -07:00
### [gdp (shrc)](/home/shrc#L133)
2021-07-30 17:59:30 -07:00
2024-02-24 08:42:38 -08:00
invoke `gd` to diff a commit from its parent. the commit defaults to "HEAD".
2021-08-02 06:50:53 -07:00
2024-07-21 22:07:19 -07:00
### [gd (shrc)](/home/shrc#L139)
2021-07-30 17:59:30 -07:00
invoke git's diff subcommand with fewer lines of context.
2024-07-21 22:07:19 -07:00
### [rgn (shrc)](/home/shrc#L142)
2021-07-30 17:59:30 -07:00
2024-02-24 08:42:38 -08:00
invoke ripgrep without respecting `.gitignore` files.
2021-08-02 06:50:53 -07:00
2024-07-21 22:07:19 -07:00
### [curls (shrc)](/home/shrc#L148)
2021-10-07 12:37:18 -07:00
2024-02-24 08:42:38 -08:00
invoke curl with less noise.
2021-10-07 12:37:18 -07:00
2024-07-21 22:07:19 -07:00
### [revend (shrc)](/home/shrc#L160)
2021-07-30 17:59:30 -07:00
reverse the 4-byte endianness of a single file. *this is an in-place operation!*
2024-07-21 22:07:19 -07:00
### [clone (shrc)](/home/shrc#L163)
2021-07-30 17:59:30 -07:00
invoke rsync suitably for creating virtually indistinguishable copies of files.
2024-07-21 22:07:19 -07:00
### [aligntabs (shrc)](/home/shrc#L166)
2021-07-30 17:59:30 -07:00
align tab-delimited fields in stdin.
2024-07-21 22:07:19 -07:00
### [crawla (shrc)](/home/shrc#L177)
2021-07-30 17:59:30 -07:00
play Dungeon Crawl: Stone Soup through ssh on the akrasiac server.
2024-07-21 22:07:19 -07:00
### [crawlz (shrc)](/home/shrc#L180)
2021-07-30 17:59:30 -07:00
play Dungeon Crawl: Stone Soup through ssh on the develz server.
2024-07-21 22:07:19 -07:00
### [diff (shrc)](/home/shrc#L183)
2021-07-30 17:59:30 -07:00
use git's diff subcommand for general diffing.
2024-07-21 22:07:19 -07:00
### [gc (shrc)](/home/shrc#L186)
2021-07-30 17:59:30 -07:00
columnize text by using git's column subcommand.
2021-08-02 06:50:53 -07:00
**TODO:** consider renaming because gc(1) already exists.
2024-07-21 22:07:19 -07:00
### [counts (shrc)](/home/shrc#L190)
2021-07-30 17:59:30 -07:00
count files in the current directory, including files found recursively.
2024-07-21 22:07:19 -07:00
### [exts (shrc)](/home/shrc#L193)
2021-07-30 17:59:30 -07:00
count and sort file extensions in the current directory, including files found recursively.
2024-07-21 22:07:19 -07:00
### [nocom (shrc)](/home/shrc#L197)
2021-07-30 17:59:30 -07:00
strip single-line C-like and shell-like comments.
2024-07-21 22:07:19 -07:00
### [jrep (shrc)](/home/shrc#L200)
2021-07-30 17:59:30 -07:00
extract strings comprised of basic ASCII or Japanese codepoints.
2024-07-21 22:07:19 -07:00
### [bomb (shrc)](/home/shrc#L203)
2021-07-30 17:59:30 -07:00
add a Byte-Order Mark to a file.
2024-07-21 22:07:19 -07:00
### [cleanse (shrc)](/home/shrc#L206)
2021-07-30 17:59:30 -07:00
strip unprintable and non-ASCII characters.
2024-07-21 22:07:19 -07:00
### [double (shrc)](/home/shrc#L209)
2021-07-30 17:59:30 -07:00
print every line twice. <br/> print every line twice.
2021-08-02 06:50:53 -07:00
**NOTE:** there also exists a double(1) program provided by
the *plotutils* package that i don't use.
2024-07-21 22:07:19 -07:00
### [katagana (shrc)](/home/shrc#L214)
2021-07-30 17:59:30 -07:00
convert katakana codepoints to their equivalent hiragana.
2021-08-06 08:20:02 -07:00
2021-10-07 12:37:18 -07:00
this is occasionally useful when translating [debug text from ancient games.](https://tcrf.net/)
2021-07-30 17:59:30 -07:00
2024-07-21 22:07:19 -07:00
### [makepkgf (shrc)](/home/shrc#L218)
2021-07-30 17:59:30 -07:00
make the freakin' package!
2024-07-21 22:07:19 -07:00
### [rakef (shrc)](/home/shrc#L221)
2021-07-30 17:59:30 -07:00
make the freakin' gem!
2024-07-21 22:07:19 -07:00
### [relog (shrc)](/home/shrc#L224)
2024-07-01 22:05:12 -07:00
log on again to refresh your unix groups, etc.
2024-07-21 22:07:19 -07:00
### [carry (shrc)](/home/shrc#L227)
2024-07-01 22:05:12 -07:00
copy files in a plain way using rsync. affected by umask.
2024-07-23 21:35:01 -07:00
## compatibility table
2021-09-22 18:43:23 -07:00
2024-07-22 05:52:36 -07:00
| script | preference | ash | bash | dash | ksh | mksh | oksh | osh | posh | yash | zsh |
| --------------------------------------------- | ---------- | --- | ---- | ---- | --- | ---- | ---- | --- | ---- | ---- | --- |
2024-07-23 05:53:05 -07:00
| [argc](#argc) | *sh* | ✔️ | ✔️ | ✔️ | ⭕ | ✔️ | ⭕ | ✔️ | ✔️ | ✔️ | ✔️ |
| [arith](#arith) | zsh | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
2024-07-22 05:52:36 -07:00
| [arrays](#arrays) | **false** | ⭕ | ✔️ | ⭕ | ✔️ | ✔️ | ⭕ | ✔️ | ⭕ | ✔️ | ✔️ |
2024-07-23 05:53:05 -07:00
| [askey](#askey) | *sh* | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| [autosync](#autosync) | zsh | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ | ✔️ |
| [bak](#bak) | *sh* | ✔️ | ✔️ | ✔️ | ⭕ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| [baknow](#baknow) | *sh* | ⭕ | ✔️ | ✔️ | ⭕ | ✔️ | ⭕ | ✔️ | ✔️ | ✔️ | ✔️ |
| [baks](#baks) | *sh* | ✔️ | ✔️ | ✔️ | ⭕ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| [bin](#bin) | zsh | ✔️ | ✔️ | ✔️ | ⭕ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| [burl](#burl) | bash | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| [busiest](#busiest) | zsh | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ | ✔️ |
2024-07-22 05:52:36 -07:00
| [clash](#clash) | *sh* | ✔️ | ✔️ | ✔️ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ✔️ |
2024-07-23 05:53:05 -07:00
| [colors](#colors) | bash | ⭕ | ✔️ | ⭕ | ✔️ | ⭕ | ⭕ | ✔️ | ⭕ | ⭕ | ✔️ |
| [colors2](#colors2) | bash | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
2024-07-22 05:52:36 -07:00
| [compile](#compile) | zsh | ⭕ | ⭕ | ⭕ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ✔️ |
2024-07-23 05:53:05 -07:00
| [confirm](#confirm) | *sh* | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
2024-07-22 05:52:36 -07:00
| [countdiff](#countdiff) | *sh* | ✔️ | ✔️ | ✔️ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ✔️ |
| [cutv](#cutv) | zsh | ⭕ | ⭕ | ⭕ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ✔️ |
2024-07-23 05:53:05 -07:00
| [dated](#dated) | *sh* | ✔️ | ✔️ | ✔️ | ⭕ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| [days](#days) | *sh* | ⭕ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| [decently](#decently) | *sh* | ✔️ | ✔️ | ✔️ | ⭕ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| [dedupe](#dedupe) | *sh* | ⭕ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| [dfu](#dfu) | *sh* | ⭕ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
2024-07-22 05:52:36 -07:00
| [disowned](#disowned) | *sh* | ✔️ | ✔️ | ✔️ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ✔️ |
2024-07-23 05:53:05 -07:00
| [document](#document) | dash | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| [e](#e) | *sh* | ✔️ | ✔️ | ✔️ | ⭕ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| [ea](#ea) | *sh* | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| [echo2](#echo2) | *sh* | ✔️ | ✔️ | ✔️ | ⭕ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
2024-07-22 05:52:36 -07:00
| [explore](#explore) | *sh* | ✔️ | ✔️ | ✔️ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ✔️ |
2024-07-23 05:53:05 -07:00
| [feud](#feud) | *sh* | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| [ff](#ff) | *sh* | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| [ghmd](#ghmd) | *sh* | ✔️ | ✔️ | ✔️ | ⭕ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| [glug](#glug) | dash | ✔️ | ✔️ | ✔️ | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ | ✔️ | ✔️ |
| [grab](#grab) | *sh* | ⭕ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| [grop](#grop) | *sh* | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| [grop4](#grop4) | *sh* | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| [has](#has) | *sh* | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| [have](#have) | *sh* | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| [hex](#hex) | zsh | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| [ify](#ify) | *sh* | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| [is_empty](#is_empty) | bash | ✔️ | ✔️ | ⭕ | ✔️ | ⭕ | ⭕ | ✔️ | ⭕ | ⭕ | ✔️ |
| [isup](#isup) | *sh* | ✔️ | ✔️ | ✔️ | ⭕ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| [join2](#join2) | *sh* | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| [lsarchive](#lsarchive) | zsh | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ | ✔️ |
| [maybesudo](#maybesudo) | *sh* | ✔️ | ✔️ | ✔️ | ⭕ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| [minutemaid](#minutemaid) | dash | ✔️ | ✔️ | ✔️ | ⭕ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| [monitor](#monitor) | zsh | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ | ✔️ |
| [morecolors](#morecolors) | bash | ⭕ | ✔️ | ⭕ | ✔️ | ⭕ | ⭕ | ✔️ | ⭕ | ⭕ | ✔️ |
2024-07-22 05:52:36 -07:00
| [noccom](#noccom) | *sh* | ✔️ | ✔️ | ✔️ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ✔️ |
2024-07-23 05:53:05 -07:00
| [note](#note) | *sh* | ✔️ | ✔️ | ✔️ | ⭕ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
2024-07-23 10:50:00 -07:00
| [notice](#notice) | *sh* | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
2024-07-23 05:53:05 -07:00
| [now](#now) | *sh* | ✔️ | ✔️ | ✔️ | ⭕ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
2024-07-22 05:52:36 -07:00
| [obtain](#obtain) | *sh* | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ |
2024-07-23 05:53:05 -07:00
| [oshi](#oshi) | *sh* | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ⭕ | ✔️ | ✔️ | ✔️ |
| [oxo](#oxo) | *sh* | ✔️ | ✔️ | ✔️ | ⭕ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
2024-07-22 05:52:36 -07:00
| [pacbm](#pacbm) | *sh* | ✔️ | ✔️ | ✔️ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ✔️ |
2024-07-23 05:53:05 -07:00
| [pause](#pause) | *sh* | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ⭕ | ⭕ | ✔️ | ✔️ | ✔️ |
2024-07-22 05:52:36 -07:00
| [pegg](#pegg) | *sh* | ✔️ | ✔️ | ✔️ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ✔️ |
2024-07-23 05:53:05 -07:00
| [permit](#permit) | *sh* | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
2024-07-22 05:52:36 -07:00
| [pippy](#pippy) | *sh* | ✔️ | ✔️ | ✔️ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ✔️ |
2024-07-23 05:53:05 -07:00
| [pre](#pre) | *sh* | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| [preload](#preload) | **false** | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| [psbm](#psbm) | *sh* | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| [randir](#randir) | *sh* | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
2024-07-22 05:52:36 -07:00
| [recolor](#recolor) | *sh* | ✔️ | ✔️ | ✔️ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ✔️ |
2024-07-23 05:53:05 -07:00
| [recombine](#recombine) | **false** | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| [rot13](#rot13) | *sh* | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
2024-07-22 05:52:36 -07:00
| [rs](#rs) | zsh | ⭕ | ⭕ | ⭕ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ✔️ |
2024-07-23 05:53:05 -07:00
| [running](#running) | *sh* | ✔️ | ✔️ | ✔️ | ⭕ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
2024-07-22 05:52:36 -07:00
| [scount](#scount) | *sh* | ✔️ | ✔️ | ✔️ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ✔️ |
| [scramble](#scramble) | *sh* | ✔️ | ✔️ | ✔️ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ✔️ |
| [scropt](#scropt) | bash | ✔️ | ✔️ | ✔️ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ✔️ |
| [shcom](#shcom) | *sh* | ✔️ | ✔️ | ✔️ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ✔️ |
| [shelly](#shelly) | **perl** | *n/a* | *n/a* | *n/a* | *n/a* | *n/a* | *n/a* | *n/a* | *n/a* | *n/a* | *n/a* |
| [similar](#similar) | *sh* | ✔️ | ✔️ | ✔️ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ✔️ |
| [slit](#slit) | dash | ✔️ | ✔️ | ✔️ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ✔️ |
| [slitt](#slitt) | dash | ✔️ | ✔️ | ✔️ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ✔️ |
2024-07-23 05:53:05 -07:00
| [sortip](#sortip) | *sh* | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
2024-07-22 05:52:36 -07:00
| [sram](#sram) | zsh | ⭕ | ✔️ | ⭕ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ✔️ |
| [stfu](#stfu) | *sh* | ✔️ | ✔️ | ✔️ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ✔️ |
| [streamcrap](#streamcrap) | **false** | ⭕ | ✔️ | ⭕ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ✔️ |
2024-07-23 05:53:05 -07:00
| [subdue](#subdue) | *sh* | ✔️ | ✔️ | ✔️ | ⭕ | ✔️ | ⭕ | ✔️ | ✔️ | ✔️ | ✔️ |
| [sum](#sum) | *sh* | ✔️ | ✔️ | ✔️ | ⭕ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| [sv](#sv) | *sh* | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| [trash](#trash) | *sh* | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| [trunc](#trunc) | *sh* | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| [unarchive](#unarchive) | zsh | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ | ✔️ |
| [unwrap](#unwrap) | *sh* | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| [v_domap](#v_domap) | *sh* | ✔️ | ✔️ | ✔️ | ⭕ | ✔️ | ⭕ | ✔️ | ✔️ | ✔️ | ✔️ |
| [v_lower](#v_lower) | *sh* | ✔️ | ✔️ | ✔️ | ⭕ | ✔️ | ⭕ | ✔️ | ✔️ | ✔️ | ✔️ |
| [v_upper](#v_upper) | *sh* | ✔️ | ✔️ | ✔️ | ⭕ | ✔️ | ⭕ | ✔️ | ✔️ | ✔️ | ✔️ |
| [wat](#wat) | zsh | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ | ✔️ |
2024-07-22 05:52:36 -07:00
| [wipe](#wipe) | *sh* | ✔️ | ✔️ | ✔️ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ✔️ |
2024-07-23 05:53:05 -07:00
| [witch](#witch) | *sh* | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| [xxp](#xxp) | *sh* | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |