2014-02-12 09:34:09 -05:00
|
|
|
sbase - suckless unix tools
|
|
|
|
===========================
|
|
|
|
|
|
|
|
sbase is a collection of unix tools that are inherently portable
|
|
|
|
across UNIX and UNIX-like systems.
|
|
|
|
|
2015-03-23 11:22:00 -04:00
|
|
|
The following tools are implemented:
|
2014-11-20 18:01:56 -05:00
|
|
|
|
2015-03-23 11:22:00 -04:00
|
|
|
'#' -> UTF-8 support, '=' -> Implicit UTF-8 support, '*' -> Finished,
|
|
|
|
'|' -> Audited, 'o' -> POSIX 2013 compliant, 'x' -> Non-POSIX,
|
|
|
|
'()' -> Petty flag
|
|
|
|
|
2015-08-04 06:59:04 -04:00
|
|
|
UTILITY MISSING
|
|
|
|
------- -------
|
2015-03-27 12:22:48 -04:00
|
|
|
=*|o basename .
|
|
|
|
=*|o cal .
|
|
|
|
=*|o cat .
|
|
|
|
=*|o chgrp .
|
|
|
|
=*|o chmod .
|
|
|
|
=*|o chown .
|
2015-03-23 11:22:00 -04:00
|
|
|
=*|x chroot .
|
2015-03-27 12:22:48 -04:00
|
|
|
=*|o cksum .
|
|
|
|
=*|o cmp .
|
2015-03-23 11:22:00 -04:00
|
|
|
#*|x cols .
|
2015-03-27 12:22:48 -04:00
|
|
|
=*|o comm .
|
|
|
|
=*|o cp (-i)
|
2015-03-23 11:22:00 -04:00
|
|
|
=*|x cron .
|
2015-03-27 12:22:48 -04:00
|
|
|
#*|o cut .
|
|
|
|
=*|o date .
|
|
|
|
=*|o dirname .
|
|
|
|
=*|o du .
|
|
|
|
=*|o echo .
|
|
|
|
=*|o env .
|
|
|
|
#*|o expand .
|
|
|
|
#*|o expr .
|
|
|
|
=*|o false .
|
2015-08-04 14:42:55 -04:00
|
|
|
= find .
|
2015-03-27 12:22:48 -04:00
|
|
|
#*|o fold .
|
2015-09-30 18:59:40 -04:00
|
|
|
=* o getconf (-v)
|
2015-03-27 12:22:48 -04:00
|
|
|
=* o grep .
|
|
|
|
=*|o head .
|
2015-03-23 11:22:00 -04:00
|
|
|
=*|x hostname .
|
2015-04-20 06:23:20 -04:00
|
|
|
=* o join .
|
2015-03-27 12:22:48 -04:00
|
|
|
=*|o kill .
|
|
|
|
=*|o link .
|
|
|
|
=*|o ln .
|
|
|
|
=*|o logger .
|
|
|
|
=*|o logname .
|
|
|
|
#* o ls (-C, -k, -m, -p, -s, -x)
|
2015-03-23 11:22:00 -04:00
|
|
|
=*|x md5sum .
|
2015-03-27 12:22:48 -04:00
|
|
|
=*|o mkdir .
|
|
|
|
=*|o mkfifo .
|
2015-03-23 11:22:00 -04:00
|
|
|
=*|x mktemp .
|
2015-03-27 12:22:48 -04:00
|
|
|
=*|o mv (-i)
|
|
|
|
=*|o nice .
|
|
|
|
#*|o nl .
|
|
|
|
=*|o nohup .
|
Implement od(1) v-flag
If this flag is not given, od(1) automatically replaces duplicate
adjacent lines with an '*' for each reoccurence.
If this flag is set, thus, no such filtering occurs.
In this case this would mean having to somehow keep the last printed
line in some backbuffer, building the next line and then doing the
necessary comparisons. This basically means that we duplicate the
functionality provided with uniq(1).
So instead of
$ od -t a > dump
you'd rather do
$ od -t a | uniq -f 1 -c > dump
Skipping the first field is necessary, as the addresses obviously differ.
Now, I was thinking hard why this flag even exists. If POSIX mandated
to add the address before the asterisk, so we know the offset of duplicate
occurrences, this would make sense. However, this is not the case.
Using uniq(1) also gives nicer output:
~ $ echo "111111111111111111111111111111111111111111111111" | od -t a -v | uniq -f 1 -c
3 0000000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 0000060 nl
1 0000061
in comparison to
$ echo "111111111111111111111111111111111111111111111111" | od -t a
0000000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
*
0000060 nl
0000061
Before working on od(1), I didn't even know it would filter out
duplicate adjacent lines like that. This is also a matter of
predictability.
Concluding, the v-flag is implicitly set and users urged to just
use the existing tools provided by the system.
I don't think we would break scripts either. Firstly, it's rather
unlikely to have duplicate lines exactly matching the line-length of
od(1). Secondly, even if a script did that specifically, in the worst
case there would be a counting error or something.
Given od(1) is mostly used interactively, we can safely assume this
feature is for the benefit of the users.
Ditch this legacy POSIX crap!
Please enter the commit message for your changes. Lines starting
2015-09-30 06:54:24 -04:00
|
|
|
od -t
|
2015-03-27 12:22:48 -04:00
|
|
|
#*|o paste .
|
2015-03-23 11:22:00 -04:00
|
|
|
=*|x printenv .
|
2015-03-27 12:22:48 -04:00
|
|
|
#*|o printf .
|
|
|
|
=*|o pwd .
|
2015-03-23 11:22:00 -04:00
|
|
|
=*|x readlink .
|
2015-03-27 12:22:48 -04:00
|
|
|
=*|o renice .
|
|
|
|
=*|o rm (-i)
|
|
|
|
=*|o rmdir .
|
2015-08-04 14:42:55 -04:00
|
|
|
# sed .
|
2015-03-23 11:22:00 -04:00
|
|
|
=*|x seq .
|
|
|
|
=*|x setsid .
|
|
|
|
=*|x sha1sum .
|
|
|
|
=*|x sha256sum .
|
|
|
|
=*|x sha512sum .
|
2015-03-27 12:22:48 -04:00
|
|
|
=*|o sleep .
|
Audit sort(1) and mark it as finished
1) Remove the function prototypes. No need for them, as the
functions are ordered.
2) Add fieldseplen, so the length of the field-separator is not
calculated nearly each time skipcolumn() is called.
3) rename next_col to skip_to_next_col so the purpose is clear,
also reorder the conditional accordingly.
4) Put parentheses around certain ternary expressions.
5) BUGFIX: Don't just exit() in check(), but make it return something,
so we can cleanly fshut() everything.
6) OFF-POSIX: Posix for no apparent reason does not allow more than
one file when the -c or -C flags are given.
This can be problematic when you want to check multiple files.
With the change 5), rewriting check() to return a value, I went
off-posix after discussing this with Dimitris to just allow
arbitrary numbers of files. Obviously, this does not break scripts
and is convenient for everybody who wants to quickly check a big
amount of files.
As soon as 1 file is "unsorted", the return value is 1, as expected.
For convenience reasons, check()'s warning now includes the filename.
7) BUGFIX: Set ret to 2 instead of 1 when the fshut(fp, *argv) fails.
8) BUGFIX: Don't forget to fshut stderr at the end. This would improperly
return 1 in the following case:
$ sort -c unsorted_file 2> /dev/full
9) Other style changes, line length, empty line before return.
2015-08-04 06:45:59 -04:00
|
|
|
#*|o sort (-d, -f, -i)
|
2015-03-27 12:22:48 -04:00
|
|
|
=*|o split .
|
2015-03-23 11:22:00 -04:00
|
|
|
=*|x sponge .
|
2015-03-27 12:22:48 -04:00
|
|
|
#*|o strings .
|
2015-03-23 11:22:00 -04:00
|
|
|
=*|x sync .
|
2015-03-27 12:22:48 -04:00
|
|
|
=*|o tail .
|
2015-03-23 11:22:00 -04:00
|
|
|
=*|x tar .
|
2015-03-27 12:22:48 -04:00
|
|
|
=*|o tee .
|
|
|
|
=*|o test .
|
2015-08-14 07:58:02 -04:00
|
|
|
=* x tftp .
|
2015-03-27 12:22:48 -04:00
|
|
|
=*|o time .
|
|
|
|
=*|o touch .
|
|
|
|
#*|o tr .
|
|
|
|
=*|o true .
|
|
|
|
=*|o tty .
|
|
|
|
=*|o uname .
|
|
|
|
#*|o unexpand .
|
|
|
|
=*|o uniq .
|
|
|
|
=*|o unlink .
|
|
|
|
=*|o uudecode .
|
|
|
|
=*|o uuencode .
|
|
|
|
#*|o wc .
|
2015-04-27 14:01:30 -04:00
|
|
|
=*|x which .
|
2015-03-27 12:22:48 -04:00
|
|
|
=*|o xargs (-p)
|
2015-03-23 11:22:00 -04:00
|
|
|
=*|x yes .
|
2014-11-20 18:01:56 -05:00
|
|
|
|
2014-02-12 13:39:13 -05:00
|
|
|
The complement of sbase is ubase[1] which is Linux-specific and
|
2014-02-12 09:34:09 -05:00
|
|
|
provides all the non-portable tools. Together they are intended to
|
|
|
|
form a base system similar to busybox but much smaller and suckless.
|
|
|
|
|
|
|
|
Building
|
|
|
|
--------
|
|
|
|
|
|
|
|
To build sbase, simply type make. You may have to fiddle with
|
|
|
|
config.mk depending on your system.
|
|
|
|
|
|
|
|
You can also build sbase-box, which generates a single binary
|
|
|
|
containing all the required tools. You can then symlink the
|
2015-02-28 09:40:16 -05:00
|
|
|
individual tools to sbase-box or run: make sbase-box-install
|
2014-02-12 09:34:09 -05:00
|
|
|
|
|
|
|
Ideally you will want to statically link sbase. If you are on Linux
|
|
|
|
we recommend using musl-libc[2].
|
|
|
|
|
|
|
|
Portability
|
|
|
|
-----------
|
|
|
|
|
|
|
|
sbase has been compiled on a variety of different operating systems,
|
|
|
|
including Linux, *BSD, OSX, Haiku, Solaris, SCO OpenServer and others.
|
|
|
|
|
|
|
|
Various combinations of operating systems and architectures have also
|
|
|
|
been built.
|
|
|
|
|
|
|
|
You can build sbase with gcc, clang, tcc, nwcc and pcc.
|
|
|
|
|
|
|
|
[1] http://git.suckless.org/ubase/
|
|
|
|
[2] http://www.musl-libc.org/
|