suckless unix tools
Go to file
Michael Forney 5c63ffad33 install: Fix -d with more than two directories
The `tflag || argc > 2` if-statement should only apply when not
creating directories (-d). Otherwise, if we are creating more than
two directories, we get an error if the last argument does not
already exist.

To fix this, move the -d case above and return early.
2020-01-11 02:19:26 -08:00
libutf
libutil chmod: Implement X perm symbol 2020-01-06 13:47:26 -08:00
.gitignore Add .gitignore 2019-06-28 00:10:10 -07:00
LICENSE ed: Don't match against line 0 in search() 2016-12-27 12:28:36 +01:00
Makefile Add .gitignore 2019-06-28 00:10:10 -07:00
README Don't justify text in README 2019-06-30 13:17:17 -07:00
TODO Add a TODO-note about crypt.c 2016-12-27 14:30:51 +01:00
arg.h
basename.1
basename.c basename: support -- 2018-07-07 12:16:11 +01:00
cal.1
cal.c cal: Centre month and year above calendar 2019-04-28 14:10:38 -07:00
cat.1
cat.c concat: Use plain read/write instead of buffered stdio 2017-07-14 07:50:47 +02:00
chgrp.1
chgrp.c chgrp: Pass -1 as the owner ID to chown(3) 2019-11-01 19:03:00 -07:00
chmod.1 chmod: Implement X perm symbol 2020-01-06 13:47:26 -08:00
chmod.c chmod: Implement X perm symbol 2020-01-06 13:47:26 -08:00
chown.1
chown.c chown/chgrp: chown target not symlink by default 2019-07-03 22:33:06 -07:00
chroot.1
chroot.c Revert "Do not use arg.h for tools which take no flags" 2019-06-29 18:33:48 -07:00
cksum.1
cksum.c Revert "Do not use arg.h for tools which take no flags" 2019-06-29 18:33:48 -07:00
cmp.1
cmp.c
cols.1
cols.c
comm.1
comm.c
compat.h
config.mk
cp.1 cp: Default to -P when -R is specified 2019-12-21 21:26:19 -08:00
cp.c cp: Default to -P when -R is specified 2019-12-21 21:26:19 -08:00
cron.1
cron.c
crypt.h Don't use buffered IO (fread) when not appropriate 2017-07-03 21:04:14 +02:00
cut.1
cut.c
date.1 date: add date/time setting capability 2017-09-03 12:36:15 -07:00
date.c date: Fix default format string 2019-04-12 19:40:34 -07:00
dirname.1
dirname.c dirname: support -- 2018-07-07 12:16:15 +01:00
du.1
du.c du: Don't print 0 entry if stat of named file fails 2017-07-03 21:03:04 +02:00
echo.1
echo.c Handle { NULL } argv[] properly in manual arg-reduction 2017-08-05 23:50:39 +02:00
ed.1 ed: add manpage 2016-12-27 12:53:30 +01:00
ed.c ed: Use reallocarray 2019-12-31 13:41:38 -08:00
env.1
env.c
expand.1
expand.c
expr.1
expr.c expr: Allocate arrays with reallocarray instead of VLA 2019-04-16 17:44:08 -07:00
false.1
false.c
find.1
find.c find: Make -H and -L flag handling clearer 2018-09-25 19:16:19 -07:00
flock.1
flock.c
fold.1
fold.c
fs.h
getconf.1 getconf: Report invalid variables as errors 2017-09-03 17:23:28 -07:00
getconf.c getconf: Ensure output was written successfully 2017-09-03 17:26:04 -07:00
getconf.sh
grep.1
grep.c grep: Fix exit status on use of -l 2019-05-20 12:38:54 -07:00
head.1
head.c
hostname.1
hostname.c Revert "Do not use arg.h for tools which take no flags" 2019-06-29 18:33:48 -07:00
join.1
join.c
kill.1
kill.c Handle { NULL } argv[] properly in manual arg-reduction 2017-08-05 23:50:39 +02:00
link.1
link.c Revert "Do not use arg.h for tools which take no flags" 2019-06-29 18:33:48 -07:00
ln.1
ln.c
logger.1
logger.c
logname.1
logname.c Handle { NULL } argv[] properly in manual arg-reduction 2017-08-05 23:50:39 +02:00
ls.1
ls.c ls, tar: Guard inclusion of sys/sysmacros.h by absence of `major` definition 2019-08-05 14:38:32 -07:00
md5.h
md5sum.1
md5sum.c
mkdir.1
mkdir.c mkdir: Fix created directory permissions 2017-07-03 21:03:11 +02:00
mkfifo.1
mkfifo.c mkfifo: Simplify -m handling 2019-06-13 13:45:37 -07:00
mktemp.1
mktemp.c
mv.1
mv.c
nice.1
nice.c
nl.1
nl.c
nohup.1
nohup.c Revert "Do not use arg.h for tools which take no flags" 2019-06-29 18:33:48 -07:00
od.1
od.c od: For the 'c' type, format non-printable charecters as octal 2018-02-25 23:01:57 -08:00
paste.1
paste.c Fix segmentation fault in paste(1) 2017-09-07 22:58:24 -07:00
pathchk.1
pathchk.c Remove unnecessary ';' after ARGEND 2019-06-29 18:39:07 -07:00
printenv.1 Fix typo 2018-11-21 10:45:43 -08:00
printenv.c Revert "Do not use arg.h for tools which take no flags" 2019-06-29 18:33:48 -07:00
printf.1
printf.c printf: handle \0 in %b arguments 2016-12-27 13:25:38 +01:00
pwd.1
pwd.c
queue.h
readlink.1
readlink.c
renice.1
renice.c
rev.1 Add rev(1) 2016-12-27 11:35:27 +01:00
rev.c Add rev(1) 2016-12-27 11:35:27 +01:00
rm.1
rm.c
rmdir.1
rmdir.c
sed.1
sed.c sed: Print better error message when open fails 2019-06-13 13:08:16 -07:00
seq.1
seq.c
setsid.1
setsid.c Revert "Do not use arg.h for tools which take no flags" 2019-06-29 18:33:48 -07:00
sha1.h
sha1sum.1
sha1sum.c
sha224.h
sha224sum.1
sha224sum.c
sha256.h
sha256sum.1
sha256sum.c
sha384.h
sha384sum.1
sha384sum.c
sha512-224.h
sha512-224sum.1
sha512-224sum.c
sha512-256.h
sha512-256sum.1
sha512-256sum.c
sha512.h
sha512sum.1
sha512sum.c
sleep.1
sleep.c Revert "Do not use arg.h for tools which take no flags" 2019-06-29 18:33:48 -07:00
sort.1
sort.c sort: Don't do fallback top-level sort in check mode 2020-01-03 15:42:33 -08:00
split.1
split.c
sponge.1
sponge.c Revert "Do not use arg.h for tools which take no flags" 2019-06-29 18:33:48 -07:00
strings.1
strings.c
sync.1
sync.c Revert "Do not use arg.h for tools which take no flags" 2019-06-29 18:33:48 -07:00
tail.1 tail: Process bytes with -c option, and add -m option for runes 2017-07-14 07:50:54 +02:00
tail.c tail: Process bytes with -c option, and add -m option for runes 2017-07-14 07:50:54 +02:00
tar.1
tar.c ls, tar: Guard inclusion of sys/sysmacros.h by absence of `major` definition 2019-08-05 14:38:32 -07:00
tee.1
tee.c Don't use buffered IO (fread) when not appropriate 2017-07-03 21:04:14 +02:00
test.1
test.c Handle { NULL } argv[] properly in manual arg-reduction 2017-08-05 23:50:39 +02:00
text.h concat: Use plain read/write instead of buffered stdio 2017-07-14 07:50:47 +02:00
tftp.1
tftp.c
time.1
time.c
touch.1
touch.c
tr.1 tr.1: Make note of some changes in the utility 2016-10-05 21:42:24 +02:00
tr.c tr: Fix infinite loop 2017-10-21 12:44:09 -07:00
true.1
true.c
tsort.1
tsort.c Remove unnecessary ';' after ARGEND 2019-06-29 18:39:07 -07:00
tty.1
tty.c Revert "Do not use arg.h for tools which take no flags" 2019-06-29 18:33:48 -07:00
uname.1
uname.c uname: check that no operands are specified 2018-09-24 13:04:06 -07:00
unexpand.1
unexpand.c
uniq.1
uniq.c
unlink.1
unlink.c Revert "Do not use arg.h for tools which take no flags" 2019-06-29 18:33:48 -07:00
utf.h libutf: Adjust runelen prototype to match definition 2019-04-16 17:27:38 -07:00
util.h libutil: Rename functions in reserved namespace to prevent potential conflict 2019-05-20 16:56:07 -07:00
uudecode.1
uudecode.c
uuencode.1
uuencode.c
wc.1
wc.c wc: Removing output padding 2019-12-21 20:19:08 -08:00
which.1
which.c which: check AT_EACCESS 2019-07-30 07:40:35 -07:00
whoami.1
whoami.c Handle { NULL } argv[] properly in manual arg-reduction 2017-08-05 23:50:39 +02:00
xargs.1
xargs.c
xinstall.1 install: ignore -s 2016-12-27 13:56:27 +01:00
xinstall.c install: Fix -d with more than two directories 2020-01-11 02:19:26 -08:00
yes.1 yes: Simplify, only support one argument 2019-10-31 18:14:18 -07:00
yes.c yes: Simplify, only support one argument 2019-10-31 18:14:18 -07:00

README

sbase - suckless unix tools
===========================

sbase is a collection of unix tools that are inherently portable across
UNIX and UNIX-like systems.

The complement of sbase is ubase[1] which is Linux-specific and 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 individual tools to
sbase-box or run: make sbase-box-install

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.

Status
------

The following tools are implemented:

'#'  -> UTF-8 support, '=' -> Implicit UTF-8 support, '*' -> Finished,
'|'  -> Audited,       'o' -> POSIX 2013 compliant,   'x' -> Non-POSIX,
'0'  -> NUL handling,  '()' -> Petty flag

      UTILITY         MISSING
      -------         -------
0=*|o basename        .
0=*|o cal             .
0=*|o cat             .
0=*|o chgrp           .
0=*|o chmod           .
0=*|o chown           .
0=*|x chroot          .
0=*|o cksum           .
0=*|o cmp             .
0#*|x cols            .
0=*|o comm            .
0=*|o cp              (-i)
0=*|x cron            .
0#*|o cut             .
0=*|o date            .
0=*|o dirname         .
0=*|o du              .
0=*|o echo            .
    o ed              .
0=*|o env             .
0#*|o expand          .
0#*|o expr            .
0=*|o false           .
0=    find            .
0=* x flock           .
0#*|o fold            .
0=*|o getconf         (-v)
 =*|o grep            .
0=*|o head            .
0=*|x hostname        .
0=*|x install         .
0=* o join            .
0=*|o kill            .
0=*|o link            .
0=*|o ln              .
0=*|o logger          .
0=*|o logname         .
0#* o ls              (-C, -k, -m, -p, -s, -x)
0=*|x md5sum          .
0=*|o mkdir           .
0=*|o mkfifo          .
0=*|x mktemp          .
0=*|o mv              (-i)
0=*|o nice            .
0#*|o nl              .
0=*|o nohup           .
0=*|o od              .
0#* o pathchk         .
 #*|o paste           .
0=*|x printenv        .
0#*|o printf          .
0=*|o pwd             .
0=*|x readlink        .
0=*|o renice          .
0#* x rev             .
0=*|o rm              (-i)
0=*|o rmdir           .
 #    sed             .
0=*|x seq             .
0=*|x setsid          .
0=*|x sha1sum         .
0=* x sha224sum       .
0=*|x sha256sum       .
0=* x sha238sum       .
0=*|x sha512sum       .
0=* x sha512-224sum   .
0=* x sha512-256sum   .
0=*|o sleep           .
0#*|o sort            .
0=*|o split           .
0=*|x sponge          .
0#*|o strings         .
0=*|x sync            .
0=*|o tail            .
0=*|x tar             .
0=*|o tee             .
0=*|o test            .
0=*|x tftp            .
0=*|o time            .
0=*|o touch           .
0#*|o tr              .
0=*|o true            .
0=* o tsort           .
0=*|o tty             .
0=*|o uname           .
0#*|o unexpand        .
0=*|o uniq            .
0=*|o unlink          .
0=*|o uudecode        .
0=*|o uuencode        .
0#*|o wc              .
0=*|x which           .
0=*|x whoami          .
0=*|o xargs           (-p)
0=*|x yes             .

[1] http://git.suckless.org/ubase/
[2] http://www.musl-libc.org/