-
-
Notifications
You must be signed in to change notification settings - Fork 162
Unix Tools
The shell interacts with a set of Unix tools in /bin
and so forth. However, in many cases, those tools have grown functionality that overlaps with shell.
Unix Tools ...
Related: Ad Hoc Protocols in Unix
-
make
and other build tools.make -j
for parallel builds. -
xargs
,-P
for parallel execution,-I {}
for substitution- Also GNU Parallel, which is mentioned in the bash manual.
-
find -exec
and-exec +
Expression languages must be fully recursive to count here.
With no lexer:
-
find
---a -o ! ( )
-
test
---a -o ! ( )
-
expr
-- arithmetic, subsumed by$(())
Languages with lexers:
awk
-
dtrace
-- modelled after awk.
Honorable mention:
-
strace
also has a little expression language, but it's not fully recursive.
-
grep
,grep -E
-
sed
,sed --regexp-extended
in GNU sed -
awk
(extended only) expr
find -regex
-
bash
itself.
-
tar
has a --sed option.
See Appendix A: How to Quickly and Correctly* Generate a Git Log in HTML
-
find -printf
(arbitrary filenames) -
stat -c
(arbitrary filenames) -
curl --write-out %{response_code}
-- URLs can't have arbitrary characters? -
printf
itself (coreutils) -
time
(/usr/bin/time
) -- mostly numbers -
date
-- mostly numbers -
bash
- the
printf
builtin - the
time
builtin and theTIMEFORMAT
string -- mostly numbers - the prompt string:
\h \W
- the
ps --format
-
awk -F '\t'
-- same asawk -F $'\t'
xargs -d '\t'
- (GNU cut -d doesn't understand tabs)
find -printf
Non-standard tools:
-
git log --pretty=format:
(arbitrary descriptions) -
hg log --template
-- http://hgbook.red-bean.com/read/customizing-the-output-of-mercurial.html (doesn't have\0
as far as I can tell.) Mercurial has its own template language likedate: {date|isodate}\n\n
(no$
).
NOTE: grep
should have a syntax for captures, like $1 $2 name: $name age: $age
. sed
just has &
for the matched group.
-
ls -q -b
for unprintable chars in filenames -
printf %q
for spaces in args -
${var@Q}
which is different thanprintf %q
!!! Seehelp-bash@
thread.
These are like "$@"
in shell.
xargs -I {} -- echo {}
find -exec {} +
Could be replaced with $_
or @_
("it").
-
find
/ls
ps
-
df
(has-h
and-H
human-readable option,--output[=FIELD_LIST]
but no format string) -
du
-- has-0
forNUL
output - TODO: look at netstat, iostat, lsof, etc. Brendan Gregg's pages.
du --exclude
rsync --include --exclude
-
find -name
,-regex
,-wholename
, etc.
- od
- xxd
- hexdump -- has a % format language.
Honestly I don't understand the difference between these!
-
getopts
builtin spec, and/usr/bin/getopt
- leading
:
means to do different error handling! Instead of the arg. Gah.
- leading
find
starts processes (with -exec
), has a recursive boolean expression language, regexes, globs, has %
and backslash escapes (in -printf
), and arg substitution ({}
is like "$@"
). It should be part of the shell!
It also doesn't give good parse error messages. Sometimes it just says "find: invalid expression" with no location information.
Wow this is crazy too:
The regular expressions understood by find are by default Emacs Regular Expressions, but this can be changed with the -regextype option.
$ find -regextype -help
find: Unknown regular expression type ‘-help’; valid types are ‘findutils-default’, ‘awk’, ‘egrep’, ‘ed’, ‘emacs’, ‘gnu-awk’, ‘grep’, ‘posix-awk’, ‘posix-basic’, ‘posix-egrep’, ‘posix-extended’, ‘posix-minimal-basic’, ‘sed’.
I didn't know there were that many regex types! And emacs is a really bad default!
- CSV, JSON, HTML, XML, recfile, 1991 paper!
- coreutils
time
doesn't have millisecond resolution! https://stackoverflow.com/questions/16959337/usr-bin-time-format-output-elapsed-time-in-milliseconds. It's hard-coded right in time.c --- usecs/10000. very arbitrary. - bash TIMEFORMAT has precision like
%3R
, but it doesn't have the exit code! Annoying.