parallel: More space efficient quoting of multiple ' in a row.

This commit is contained in:
Ole Tange 2023-01-13 22:38:05 +01:00
parent acb915b074
commit f7074ae561
7 changed files with 397 additions and 197 deletions

View file

@ -25,7 +25,7 @@ single solution that just works:
* https://web.archive.org/web/20210923091339/https://blog.licensezero.com/2019/08/26/but-you-said.html * https://web.archive.org/web/20210923091339/https://blog.licensezero.com/2019/08/26/but-you-said.html
* https://www.numfocus.org/blog/why-is-numpy-only-now-getting-funded/ * https://www.numfocus.org/blog/why-is-numpy-only-now-getting-funded/
* https://feross.org/funding-experiment-recap/ * https://feross.org/funding-experiment-recap/
* https://www.fordfoundation.org/media/2976/roads-and-bridges-the-unseen-labor-behind-our-digital-infrastructure.pdf
== Is the citation notice compatible with GPLv3? == == Is the citation notice compatible with GPLv3? ==

View file

@ -4,6 +4,18 @@
Quote of the month: Quote of the month:
Colorful output
parallel, with --color flag
tasks more vibrant now
--line-buffer, a flag
parallel, now more precise
Output is in sync
write a haiku about gnu parallel and the :::+ option
Got around to using GNU parallel for the first time from a suggestion by @jdwasmuth ... now I'm wishing I started using this years ago Got around to using GNU parallel for the first time from a suggestion by @jdwasmuth ... now I'm wishing I started using this years ago
-- Stefan Gavriliuc @GavriliucStefan@twitter -- Stefan Gavriliuc @GavriliucStefan@twitter

View file

@ -262,7 +262,7 @@ from:tange@gnu.org
to:parallel@gnu.org, bug-parallel@gnu.org to:parallel@gnu.org, bug-parallel@gnu.org
stable-bcc: Jesse Alama <jessealama@fastmail.fm> stable-bcc: Jesse Alama <jessealama@fastmail.fm>
Subject: GNU Parallel 20230122 ('Pele/MashaAmina<<>>') released Subject: GNU Parallel 20230122 ('Bolsanaro+Brasilia/Pele/MashaAmina<<>>') released
GNU Parallel 20230122 ('<<>>') has been released. It is available for download at: lbry://@GnuParallel:4 GNU Parallel 20230122 ('<<>>') has been released. It is available for download at: lbry://@GnuParallel:4
@ -278,6 +278,8 @@ News about GNU Parallel:
https://www.purevpn.com/blog/the-best-hacking-tools-of-2023/#11_GNU_Parallel https://www.purevpn.com/blog/the-best-hacking-tools-of-2023/#11_GNU_Parallel
https://www.vivaolinux.com.br/artigo/GNU-Parallel-criando-atividades-em-paralelo-com-shell-script/
this is wrong-https://climbtheladder.com/10-gnu-parallel-best-practices/ this is wrong-https://climbtheladder.com/10-gnu-parallel-best-practices/
<<>> <<>>

View file

@ -8,36 +8,58 @@ bin_SCRIPTS = parallel sql niceload parcat parset parsort \
env_parallel.ksh env_parallel.mksh env_parallel.pdksh \ env_parallel.ksh env_parallel.mksh env_parallel.pdksh \
env_parallel.sh env_parallel.tcsh env_parallel.zsh env_parallel.sh env_parallel.tcsh env_parallel.zsh
POD_FILES = parcat.pod parset.pod sem.pod parallel.pod \
env_parallel.pod niceload.pod parallel_examples.pod \
parallel_tutorial.pod parallel_book.pod parallel_design.pod \
parallel_alternatives.pod
MAN_FILES = parallel.1 env_parallel.1 sem.1 sql.1 niceload.1 \
parallel_examples.7 parallel_tutorial.7 parallel_book.7 \
parallel_design.7 parallel_alternatives.7 parcat.1 parset.1 \
parsort.1
PDF_MAN = parallel.pdf env_parallel.pdf sem.pdf sql.pdf \
niceload.pdf parallel_examples.pdf parallel_tutorial.pdf \
parallel_book.pdf parallel_design.pdf \
parallel_alternatives.pdf parcat.pdf parset.pdf parsort.pdf
PDF_OTHER = parallel_cheat_bw.pdf parallel_options_map.pdf
PDF_FILES = $(PDF_MAN) $(PDF_OTHER)
RST_FILES = parallel.rst env_parallel.rst sem.rst sql.rst \
niceload.rst parallel_examples.rst parallel_tutorial.rst \
parallel_book.rst parallel_design.rst \
parallel_alternatives.rst parcat.rst parset.rst parsort.rst
TEXI_FILES = parallel.texi env_parallel.texi sem.texi sql.texi \
niceload.texi parallel_examples.texi parallel_tutorial.texi \
parallel_book.texi parallel_design.texi \
parallel_alternatives.texi parcat.texi parset.texi \
parsort.texi
HTML_FILES = parallel.html env_parallel.html sem.html sql.html \
niceload.html parallel_examples.html parallel_tutorial.html \
parallel_book.html parallel_design.html \
parallel_alternatives.html parcat.html parset.html \
parsort.html
install-exec-hook: install-exec-hook:
rm "$(DESTDIR)$(bindir)"/sem || true rm "$(DESTDIR)$(bindir)"/sem || true
$(LN_S) parallel "$(DESTDIR)$(bindir)"/sem $(LN_S) parallel "$(DESTDIR)$(bindir)"/sem
if DOCUMENTATION if DOCUMENTATION
man_MANS = parallel.1 env_parallel.1 sem.1 sql.1 niceload.1 \ man_MANS = $(MAN_FILES)
parallel_examples.7 parallel_tutorial.7 parallel_book.7 \ doc_DATA = $(HTML_FILES) $(TEXI_FILES) $(RST_FILES) $(PDF_FILES)
parallel_design.7 parallel_alternatives.7 parcat.1 parset.1 \
parsort.1
doc_DATA = parallel.html env_parallel.html sem.html sql.html \
niceload.html parallel_examples.html parallel_tutorial.html \
parallel_book.html parallel_design.html \
parallel_alternatives.html parcat.html parset.html \
parsort.html \
parallel.texi env_parallel.texi sem.texi sql.texi \
niceload.texi parallel_examples.texi parallel_tutorial.texi \
parallel_book.texi parallel_design.texi \
parallel_alternatives.texi parcat.texi parset.texi \
parsort.texi \
parallel.rst env_parallel.rst sem.rst sql.rst niceload.rst \
parallel_examples.rst parallel_tutorial.rst parallel_book.rst \
parallel_design.rst parallel_alternatives.rst parcat.rst \
parset.rst parsort.rst \
parallel.pdf env_parallel.pdf sem.pdf sql.pdf niceload.pdf \
parallel_examples.pdf parallel_tutorial.pdf parallel_book.pdf \
parallel_design.pdf parallel_alternatives.pdf parcat.pdf \
parset.pdf parsort.pdf parallel_cheat_bw.pdf \
parallel_options_map.pdf
endif endif
DISTCLEANFILES = $(MAN_FILES) $(HTML_FILES) $(TEXI_FILES) \
$(RST_FILES) $(PDF_FILES)
EXTRA_DIST = $(bin_SCRIPTS) sem $(POD_FILES) \
parallel_cheat_bw.fodt pod2graph $(DISTCLEANFILES)
web: sphinx web: sphinx
true true
@ -381,36 +403,3 @@ parallel_options_map.pdf: parallel.pod pod2graph
sem: parallel sem: parallel
ln -fs parallel sem ln -fs parallel sem
DISTCLEANFILES = parallel.1 env_parallel.1 sem.1 sql.1 niceload.1 \
parallel_examples.7 parallel_tutorial.7 parallel_book.7 \
parallel_design.7 parallel_alternatives.7 parcat.1 parset.1 \
parsort.1 \
parallel.html env_parallel.html sem.html sql.html \
niceload.html parallel_examples.html parallel_tutorial.html \
parallel_book.html parallel_design.html \
parallel_alternatives.html parcat.html parset.html \
parsort.html \
parallel.texi env_parallel.texi sem.texi sql.texi \
niceload.texi parallel_examples.texi parallel_tutorial.texi \
parallel_book.texi parallel_design.texi \
parallel_alternatives.texi parcat.texi parset.texi \
parsort.texi \
parallel.rst env_parallel.rst sem.rst sql.rst niceload.rst \
parallel_examples.rst parallel_tutorial.rst parallel_book.rst \
parallel_design.rst parallel_alternatives.rst parcat.rst \
parset.rst parsort.rst \
parallel.pdf env_parallel.pdf sem.pdf sql.pdf niceload.pdf \
parallel_examples.pdf parallel_tutorial.pdf parallel_book.pdf \
parallel_design.pdf parallel_alternatives.pdf parcat.pdf \
parset.pdf parsort.pdf parallel_cheat_bw.pdf \
parallel_options_map.pdf
EXTRA_DIST = parallel sem sql niceload parcat parset parsort \
env_parallel env_parallel.ash env_parallel.bash \
env_parallel.csh env_parallel.dash env_parallel.fish \
env_parallel.ksh env_parallel.mksh env_parallel.pdksh \
env_parallel.sh env_parallel.tcsh env_parallel.zsh parcat.pod \
parset.pod sem.pod parallel.pod env_parallel.pod niceload.pod \
parallel_examples.pod parallel_tutorial.pod parallel_book.pod \
parallel_design.pod parallel_alternatives.pod \
parallel_cheat_bw.fodt pod2graph $(DISTCLEANFILES)

View file

@ -1955,7 +1955,7 @@ sub options_completion_hash() {
# Before changing these lines, please read # Before changing these lines, please read
# https://www.gnu.org/software/parallel/parallel_design.html#citation-notice # https://www.gnu.org/software/parallel/parallel_design.html#citation-notice
# https://git.savannah.gnu.org/cgit/parallel.git/tree/doc/citation-notice-faq.txt # https://git.savannah.gnu.org/cgit/parallel.git/tree/doc/citation-notice-faq.txt
# You accept to be put in a public hall of shame by removing # You accept to be put in a public hall-of-shame by removing
# these lines. # these lines.
("bibtex|citation". ("bibtex|citation".
"[Print the citation notice and BibTeX entry for GNU parallel, ". "[Print the citation notice and BibTeX entry for GNU parallel, ".
@ -2194,8 +2194,7 @@ sub parse_options(@) {
# Before changing these line, please read # Before changing these line, please read
# https://www.gnu.org/software/parallel/parallel_design.html#citation-notice # https://www.gnu.org/software/parallel/parallel_design.html#citation-notice
# https://git.savannah.gnu.org/cgit/parallel.git/tree/doc/citation-notice-faq.txt # https://git.savannah.gnu.org/cgit/parallel.git/tree/doc/citation-notice-faq.txt
# You accept to be added to a public hall of shame by # You accept to be added to a public hall-of-shame by removing the lines.
# removing the lines.
if(defined $opt::citation) { if(defined $opt::citation) {
citation(\@argv_before,\@ARGV); citation(\@argv_before,\@ARGV);
wait_and_exit(0); wait_and_exit(0);
@ -3557,7 +3556,7 @@ sub shell_quote_scalar_default($) {
# $shell_quoted = string quoted as needed by the shell # $shell_quoted = string quoted as needed by the shell
local $_ = $_[0]; local $_ = $_[0];
if(/[^-_.+a-z0-9\/]/i) { if(/[^-_.+a-z0-9\/]/i) {
s/'/'"'"'/g; # "-quote '-quotes s/'+/'"$&"'/g; # "-quote '-quotes: ''' => "'''"
$_ = "'$_'"; # '-quote entire string $_ = "'$_'"; # '-quote entire string
s/^''//; # Remove unneeded '' at ends s/^''//; # Remove unneeded '' at ends
s/''$//; # (faster than s/^''|''$//g) s/''$//; # (faster than s/^''|''$//g)

View file

@ -104,7 +104,7 @@ The following features are in some of the comparable tools:
=over =over
=item E1. Running jobs in parallel =item E1. Run jobs in parallel
=item E2. List running jobs =item E2. List running jobs
@ -246,7 +246,7 @@ the last half of the line is from another process. The example
B<Parallel grep> cannot be done reliably with B<xargs> because of B<Parallel grep> cannot be done reliably with B<xargs> because of
this. To see this in action try: this. To see this in action try:
parallel perl -e '\$a=\"1\".\"{}\"x10000000\;print\ \$a,\"\\n\"' \ parallel perl -e "'"'$a="1"."{}"x10000000;print $a,"\n"'"'" \
'>' {} ::: a b c d e f g h '>' {} ::: a b c d e f g h
# Serial = no mixing = the wanted result # Serial = no mixing = the wanted result
# 'tr -s a-z' squeezes repeating letters into a single letter # 'tr -s a-z' squeezes repeating letters into a single letter
@ -417,7 +417,8 @@ using GNU B<parallel>:
1$ find /path/to/files -type f | parallel gzip 1$ find /path/to/files -type f | parallel gzip
2$ ./ppss.sh standalone -d /path/to/files -c 'cp "$ITEM" /destination/dir ' 2$ ./ppss.sh standalone -d /path/to/files \
-c 'cp "$ITEM" /destination/dir '
2$ find /path/to/files -type f | parallel cp {} /destination/dir 2$ find /path/to/files -type f | parallel cp {} /destination/dir
@ -435,9 +436,11 @@ using GNU B<parallel>:
./ppss deploy -C config.cfg ./ppss deploy -C config.cfg
./ppss start -C config ./ppss start -C config
5$ # parallel does not use configs. If you want a different username put it in nodes.txt: user@hostname 5$ # parallel does not use configs. If you want
# a different username put it in nodes.txt: user@hostname
find source/dir -type f | find source/dir -type f |
parallel --sshloginfile nodes.txt --trc {.}.mp3 lame -a {} -o {.}.mp3 --preset standard --quiet parallel --sshloginfile nodes.txt --trc {.}.mp3 \
lame -a {} -o {.}.mp3 --preset standard --quiet
6$ ./ppss stop -C config.cfg 6$ ./ppss stop -C config.cfg
@ -1124,7 +1127,7 @@ file. GNU B<parallel> does not.
https://github.com/reconquest/orgalorg https://github.com/reconquest/orgalorg
=head2 DIFFERENCES BETWEEN Rust parallel AND GNU Parallel =head2 DIFFERENCES BETWEEN Rust parallel(mmstick) AND GNU Parallel
Rust parallel focuses on speed. It is almost as fast as B<xargs>, but Rust parallel focuses on speed. It is almost as fast as B<xargs>, but
not as fast as B<parallel-bash>. It implements a few features from GNU not as fast as B<parallel-bash>. It implements a few features from GNU
@ -2618,18 +2621,26 @@ You can then do:
=head3 EXAMPLES FROM rargs MANUAL =head3 EXAMPLES FROM rargs MANUAL
ls *.bak | rargs -p '(.*)\.bak' mv {0} {1} 1$ ls *.bak | rargs -p '(.*)\.bak' mv {0} {1}
ls *.bak | parallel mv {} {.}
cat download-list.csv | rargs -p '(?P<url>.*),(?P<filename>.*)' wget {url} -O {filename} 1$ ls *.bak | parallel mv {} {.}
cat download-list.csv | parallel --csv wget {1} -O {2}
2$ cat download-list.csv |
rargs -p '(?P<url>.*),(?P<filename>.*)' wget {url} -O {filename}
2$ cat download-list.csv |
parallel --csv wget {1} -O {2}
# or use regexps: # or use regexps:
cat download-list.csv | 2$ cat download-list.csv |
parallel --rpl '{url} s/,.*//' --rpl '{filename} s/.*?,//' wget {url} -O {filename} parallel --rpl '{url} s/,.*//' --rpl '{filename} s/.*?,//' \
wget {url} -O {filename}
cat /etc/passwd | rargs -d: echo -e 'id: "{1}"\t name: "{5}"\t rest: "{6..::}"' 3$ cat /etc/passwd |
cat /etc/passwd | rargs -d: echo -e 'id: "{1}"\t name: "{5}"\t rest: "{6..::}"'
parallel -q --colsep : echo -e 'id: "{1}"\t name: "{5}"\t rest: "{=6 $_=join":",@arg[6..$#arg]=}"'
3$ cat /etc/passwd |
parallel -q --colsep : \
echo -e 'id: "{1}"\t name: "{5}"\t rest: "{=6 $_=join":",@arg[6..$#arg]=}"'
https://github.com/lotabout/rargs (Last checked: 2020-01) https://github.com/lotabout/rargs (Last checked: 2020-01)
@ -2944,7 +2955,7 @@ composed commands.
8$ # GNU Parallel does not need to stop a server 8$ # GNU Parallel does not need to stop a server
https://github.com/ctbur/async/ (Last checked: 2020-11) https://github.com/ctbur/async/ (Last checked: 2023-01)
=head2 DIFFERENCES BETWEEN pardi AND GNU Parallel =head2 DIFFERENCES BETWEEN pardi AND GNU Parallel
@ -2989,14 +3000,16 @@ parallel>).
2$ pardi -n 1 -i data/test_in.types -o data/test_out.types \ 2$ pardi -n 1 -i data/test_in.types -o data/test_out.types \
-d 'r:^#atoms:' -w 'cat %IN > %OUT' -d 'r:^#atoms:' -w 'cat %IN > %OUT'
2$ cat data/test_in.types | parallel -n 1 -k --pipe --cat \ 2$ cat data/test_in.types |
--regexp --recstart '^#atoms' 'cat {}' > data/test_out.types parallel -n 1 -k --pipe --cat --regexp --recstart '^#atoms' \
'cat {}' > data/test_out.types
3$ pardi -c 6 -i data/test_in.types -o data/test_out.types \ 3$ pardi -c 6 -i data/test_in.types -o data/test_out.types \
-d 'r:^#atoms:' -w 'cat %IN > %OUT' -d 'r:^#atoms:' -w 'cat %IN > %OUT'
3$ cat data/test_in.types | parallel -n 6 -k --pipe --cat \ 3$ cat data/test_in.types |
--regexp --recstart '^#atoms' 'cat {}' > data/test_out.types parallel -n 6 -k --pipe --cat --regexp --recstart '^#atoms' \
'cat {}' > data/test_out.types
4$ pardi -i data/decoys.mol2 -o data/still_decoys.mol2 \ 4$ pardi -i data/decoys.mol2 -o data/still_decoys.mol2 \
-d 's:@<TRIPOS>MOLECULE' -w 'cp %IN %OUT' -d 's:@<TRIPOS>MOLECULE' -w 'cp %IN %OUT'
@ -3069,9 +3082,11 @@ Summary (see legend above):
1$ simple_gpu_scheduler --gpus 0 1 2 < gpu_commands.txt 1$ simple_gpu_scheduler --gpus 0 1 2 < gpu_commands.txt
1$ parallel -j3 --shuf \ 1$ parallel -j3 --shuf \
CUDA_VISIBLE_DEVICES='{=1 $_=slot()-1 =} {=uq;=}' < gpu_commands.txt CUDA_VISIBLE_DEVICES='{=1 $_=slot()-1 =} {=uq;=}' \
< gpu_commands.txt
2$ simple_hypersearch "python3 train_dnn.py --lr {lr} --batch_size {bs}" \ 2$ simple_hypersearch \
"python3 train_dnn.py --lr {lr} --batch_size {bs}" \
-p lr 0.001 0.0005 0.0001 -p bs 32 64 128 | -p lr 0.001 0.0005 0.0001 -p bs 32 64 128 |
simple_gpu_scheduler --gpus 0,1,2 simple_gpu_scheduler --gpus 0,1,2
@ -3592,6 +3607,188 @@ https://github.com/ctbur/async
(Last checked: 2023-01) (Last checked: 2023-01)
=head2 DIFFERENCES BETWEEN tandem AND GNU Parallel
Summary (see legend above):
=over
=item - - - I4 - - N/A
=item M1 - - - - M6
=item - - O3 - - - - N/A - -
=item E1 - E3 - E5 - -
=item - - - - - - - - -
=item - -
=back
B<tandem> runs full commands in parallel. It is made for starting a
"server", running a job against the server, and when the job is done,
the server is killed.
More generally: it kills all jobs when the first job completes -
similar to '--halt now,done=1'.
B<tandem> silently discards some output. It is unclear exactly when
this happens. It looks like a race condition, because it varies for
each run.
$ tandem "seq 10000" | wc -l
6731 <- This should always be 10002
=head3 EXAMPLES FROM Demo
tandem \
'php -S localhost:8000' \
'esbuild src/*.ts --bundle --outdir=dist --watch' \
'tailwind -i src/index.css -o dist/index.css --watch'
# Emulate tandem's behaviour
PARALLEL='--color --lb --halt now,done=1 --tagstring '
PARALLEL="$PARALLEL'"'{=s/ .*//; $_.=".".$app{$_}++;=}'"'"
export PARALLEL
parallel ::: \
'php -S localhost:8000' \
'esbuild src/*.ts --bundle --outdir=dist --watch' \
'tailwind -i src/index.css -o dist/index.css --watch'
=head3 EXAMPLES FROM tandem -h
# Emulate tandem's behaviour
PARALLEL='--color --lb --halt now,done=1 --tagstring '
PARALLEL="$PARALLEL'"'{=s/ .*//; $_.=".".$app{$_}++;=}'"'"
export PARALLEL
1$ tandem 'sleep 5 && echo "hello"' 'sleep 2 && echo "world"'
1$ parallel ::: 'sleep 5 && echo "hello"' 'sleep 2 && echo "world"'
# '-t 0' fails. But '--timeout 0 works'
2$ tandem --timeout 0 'sleep 5 && echo "hello"' \
'sleep 2 && echo "world"'
2$ parallel --timeout 0 ::: 'sleep 5 && echo "hello"' \
'sleep 2 && echo "world"'
=head3 EXAMPLES FROM tandem's readme.md
# Emulate tandem's behaviour
PARALLEL='--color --lb --halt now,done=1 --tagstring '
PARALLEL="$PARALLEL'"'{=s/ .*//; $_.=".".$app{$_}++;=}'"'"
export PARALLEL
1$ tandem 'next dev' 'nodemon --quiet ./server.js'
1$ parallel ::: 'next dev' 'nodemon --quiet ./server.js'
2$ cat package.json
{
"scripts": {
"dev:php": "...",
"dev:js": "...",
"dev:css": "..."
}
}
tandem 'npm:dev:php' 'npm:dev:js' 'npm:dev:css'
# GNU Parallel uses bash functions instead
2$ cat package.sh
dev:php() { ... ; }
dev:js() { ... ; }
dev:css() { ... ; }
export -f dev:php dev:js dev:css
. package.sh
parallel ::: dev:php dev:js dev:css
3$ tandem 'npm:dev:*'
3$ compgen -A function | grep ^dev: | parallel
For usage in Makefiles, include a copy of GNU Parallel with your
source using `parallel --embed`. This has the added benefit of also
working if access to the internet is down or restricted.
https://github.com/rosszurowski/tandem
(Last checked: 2023-01)
=head2 DIFFERENCES BETWEEN rust-parallel(aaronriekenberg) AND GNU Parallel
Summary (see legend above):
=over
=item I1 I2 I3 - - - -
=item - - - - - M6
=item O1 O2 O3 - O5 O6 - N/A - O10
=item E1 - - E4 - - -
=item - - - - - - - - -
=item - -
=back
B<rust-parallel> has a goal of only using Rust. It seems it is
impossible to call bash functions from the command line. You would
need to put these in a script.
Calling script that miss the shebang line (#! as first line) fails.
=head3 EXAMPLES FROM rust-parallel's README.md
$ cat >./test <<EOL
echo hi
echo there
echo how
echo are
echo you
EOL
1$ cat test | rust-parallel -j5
1$ cat test | parallel -j5
2$ cat test | rust-parallel -j1
2$ cat test | parallel -j1
3$ head -100 /usr/share/dict/words | rust-parallel md5 -s
3$ head -100 /usr/share/dict/words | parallel md5 -s
4$ find . -type f -print0 | rust-parallel -0 gzip -f -k
4$ find . -type f -print0 | parallel -0 gzip -f -k
5$ head -100 /usr/share/dict/words |
awk '{printf "md5 -s %s\n", $1}' | rust-parallel
5$ head -100 /usr/share/dict/words |
awk '{printf "md5 -s %s\n", $1}' | parallel
6$ head -100 /usr/share/dict/words | rust-parallel md5 -s |
grep -i abba
6$ head -100 /usr/share/dict/words | parallel md5 -s |
grep -i abba
https://github.com/aaronriekenberg/rust-parallel
(Last checked: 2023-01)
=head2 Todo =head2 Todo
http://code.google.com/p/push/ (cannot compile) http://code.google.com/p/push/ (cannot compile)
@ -3742,7 +3939,8 @@ full for at least 2 seconds.
# Generate 100 GB to fill $TMPDIR # Generate 100 GB to fill $TMPDIR
# Adjust if /tmp is bigger than 100 GB # Adjust if /tmp is bigger than 100 GB
yes | head -c 100G >$TMPDIR/$$ yes | head -c 100G >$TMPDIR/$$
# Generate 10 MB output that will not be buffered due to full disk # Generate 10 MB output that will not be buffered
# due to full disk
perl -e 'print "X"x10_000_000' | head -c 10M perl -e 'print "X"x10_000_000' | head -c 10M
echo This part is missing from incomplete output echo This part is missing from incomplete output
sleep 2 sleep 2

View file

@ -129,92 +129,92 @@ par_command_len_shellquote -Slo -j10 ' 1 7 1 1 2188
par_command_len_shellquote -Slo -j10 ' 1 8 1 1 6562 par_command_len_shellquote -Slo -j10 ' 1 8 1 1 6562
par_command_len_shellquote -Slo -j10 ' 1 9 0 0 0 par_command_len_shellquote -Slo -j10 ' 1 9 0 0 0
par_command_len_shellquote -Slo -j10 ' 1 10 0 0 0 par_command_len_shellquote -Slo -j10 ' 1 10 0 0 0
par_command_len_shellquote -Slo -j10 ' 2 1 1 1 9 par_command_len_shellquote -Slo -j10 ' 2 1 1 1 5
par_command_len_shellquote -Slo -j10 ' 2 2 1 1 27 par_command_len_shellquote -Slo -j10 ' 2 2 1 1 11
par_command_len_shellquote -Slo -j10 ' 2 3 1 1 81 par_command_len_shellquote -Slo -j10 ' 2 3 1 1 29
par_command_len_shellquote -Slo -j10 ' 2 4 1 1 243 par_command_len_shellquote -Slo -j10 ' 2 4 1 1 83
par_command_len_shellquote -Slo -j10 ' 2 5 1 1 729 par_command_len_shellquote -Slo -j10 ' 2 5 1 1 245
par_command_len_shellquote -Slo -j10 ' 2 6 1 1 2187 par_command_len_shellquote -Slo -j10 ' 2 6 1 1 731
par_command_len_shellquote -Slo -j10 ' 2 7 1 1 6561 par_command_len_shellquote -Slo -j10 ' 2 7 1 1 2189
par_command_len_shellquote -Slo -j10 ' 2 8 0 0 0 par_command_len_shellquote -Slo -j10 ' 2 8 0 0 0
par_command_len_shellquote -Slo -j10 ' 2 9 0 0 0 par_command_len_shellquote -Slo -j10 ' 2 9 0 0 0
par_command_len_shellquote -Slo -j10 ' 2 10 0 0 0 par_command_len_shellquote -Slo -j10 ' 2 10 0 0 0
par_command_len_shellquote -Slo -j10 ' 3 1 1 1 14 par_command_len_shellquote -Slo -j10 ' 3 1 1 1 6
par_command_len_shellquote -Slo -j10 ' 3 2 1 1 44 par_command_len_shellquote -Slo -j10 ' 3 2 1 1 12
par_command_len_shellquote -Slo -j10 ' 3 3 1 1 134 par_command_len_shellquote -Slo -j10 ' 3 3 1 1 30
par_command_len_shellquote -Slo -j10 ' 3 4 1 1 404 par_command_len_shellquote -Slo -j10 ' 3 4 1 1 84
par_command_len_shellquote -Slo -j10 ' 3 5 1 1 1214 par_command_len_shellquote -Slo -j10 ' 3 5 1 1 246
par_command_len_shellquote -Slo -j10 ' 3 6 1 1 3644 par_command_len_shellquote -Slo -j10 ' 3 6 1 1 732
par_command_len_shellquote -Slo -j10 ' 3 7 1 1 10xxx par_command_len_shellquote -Slo -j10 ' 3 7 1 1 2190
par_command_len_shellquote -Slo -j10 ' 3 8 0 0 0 par_command_len_shellquote -Slo -j10 ' 3 8 0 0 0
par_command_len_shellquote -Slo -j10 ' 3 9 0 0 0 par_command_len_shellquote -Slo -j10 ' 3 9 0 0 0
par_command_len_shellquote -Slo -j10 ' 3 10 0 0 0 par_command_len_shellquote -Slo -j10 ' 3 10 0 0 0
par_command_len_shellquote -Slo -j10 ' 4 1 1 1 19 par_command_len_shellquote -Slo -j10 ' 4 1 1 1 7
par_command_len_shellquote -Slo -j10 ' 4 2 1 1 61 par_command_len_shellquote -Slo -j10 ' 4 2 1 1 13
par_command_len_shellquote -Slo -j10 ' 4 3 1 1 187 par_command_len_shellquote -Slo -j10 ' 4 3 1 1 31
par_command_len_shellquote -Slo -j10 ' 4 4 1 1 565 par_command_len_shellquote -Slo -j10 ' 4 4 1 1 85
par_command_len_shellquote -Slo -j10 ' 4 5 1 1 1699 par_command_len_shellquote -Slo -j10 ' 4 5 1 1 247
par_command_len_shellquote -Slo -j10 ' 4 6 1 1 5101 par_command_len_shellquote -Slo -j10 ' 4 6 1 1 733
par_command_len_shellquote -Slo -j10 ' 4 7 1 1 15xxx par_command_len_shellquote -Slo -j10 ' 4 7 1 1 2191
par_command_len_shellquote -Slo -j10 ' 4 8 0 0 0 par_command_len_shellquote -Slo -j10 ' 4 8 0 0 0
par_command_len_shellquote -Slo -j10 ' 4 9 0 0 0 par_command_len_shellquote -Slo -j10 ' 4 9 0 0 0
par_command_len_shellquote -Slo -j10 ' 4 10 0 0 0 par_command_len_shellquote -Slo -j10 ' 4 10 0 0 0
par_command_len_shellquote -Slo -j10 ' 5 1 1 1 24 par_command_len_shellquote -Slo -j10 ' 5 1 1 1 8
par_command_len_shellquote -Slo -j10 ' 5 2 1 1 78 par_command_len_shellquote -Slo -j10 ' 5 2 1 1 14
par_command_len_shellquote -Slo -j10 ' 5 3 1 1 240 par_command_len_shellquote -Slo -j10 ' 5 3 1 1 32
par_command_len_shellquote -Slo -j10 ' 5 4 1 1 726 par_command_len_shellquote -Slo -j10 ' 5 4 1 1 86
par_command_len_shellquote -Slo -j10 ' 5 5 1 1 2184 par_command_len_shellquote -Slo -j10 ' 5 5 1 1 248
par_command_len_shellquote -Slo -j10 ' 5 6 1 1 6558 par_command_len_shellquote -Slo -j10 ' 5 6 1 1 734
par_command_len_shellquote -Slo -j10 ' 5 7 1 1 19xxx par_command_len_shellquote -Slo -j10 ' 5 7 1 1 2192
par_command_len_shellquote -Slo -j10 ' 5 8 0 0 0 par_command_len_shellquote -Slo -j10 ' 5 8 0 0 0
par_command_len_shellquote -Slo -j10 ' 5 9 0 0 0 par_command_len_shellquote -Slo -j10 ' 5 9 0 0 0
par_command_len_shellquote -Slo -j10 ' 5 10 0 0 0 par_command_len_shellquote -Slo -j10 ' 5 10 0 0 0
par_command_len_shellquote -Slo -j10 ' 6 1 1 1 29 par_command_len_shellquote -Slo -j10 ' 6 1 1 1 9
par_command_len_shellquote -Slo -j10 ' 6 2 1 1 95 par_command_len_shellquote -Slo -j10 ' 6 2 1 1 15
par_command_len_shellquote -Slo -j10 ' 6 3 1 1 293 par_command_len_shellquote -Slo -j10 ' 6 3 1 1 33
par_command_len_shellquote -Slo -j10 ' 6 4 1 1 887 par_command_len_shellquote -Slo -j10 ' 6 4 1 1 87
par_command_len_shellquote -Slo -j10 ' 6 5 1 1 2669 par_command_len_shellquote -Slo -j10 ' 6 5 1 1 249
par_command_len_shellquote -Slo -j10 ' 6 6 1 1 8015 par_command_len_shellquote -Slo -j10 ' 6 6 1 1 735
par_command_len_shellquote -Slo -j10 ' 6 7 0 0 0 par_command_len_shellquote -Slo -j10 ' 6 7 0 0 0
par_command_len_shellquote -Slo -j10 ' 6 8 0 0 0 par_command_len_shellquote -Slo -j10 ' 6 8 0 0 0
par_command_len_shellquote -Slo -j10 ' 6 9 0 0 0 par_command_len_shellquote -Slo -j10 ' 6 9 0 0 0
par_command_len_shellquote -Slo -j10 ' 6 10 0 0 0 par_command_len_shellquote -Slo -j10 ' 6 10 0 0 0
par_command_len_shellquote -Slo -j10 ' 7 1 1 1 34 par_command_len_shellquote -Slo -j10 ' 7 1 1 1 10
par_command_len_shellquote -Slo -j10 ' 7 2 1 1 112 par_command_len_shellquote -Slo -j10 ' 7 2 1 1 16
par_command_len_shellquote -Slo -j10 ' 7 3 1 1 346 par_command_len_shellquote -Slo -j10 ' 7 3 1 1 34
par_command_len_shellquote -Slo -j10 ' 7 4 1 1 1048 par_command_len_shellquote -Slo -j10 ' 7 4 1 1 88
par_command_len_shellquote -Slo -j10 ' 7 5 1 1 3154 par_command_len_shellquote -Slo -j10 ' 7 5 1 1 250
par_command_len_shellquote -Slo -j10 ' 7 6 1 1 9472 par_command_len_shellquote -Slo -j10 ' 7 6 1 1 736
par_command_len_shellquote -Slo -j10 ' 7 7 0 0 0 par_command_len_shellquote -Slo -j10 ' 7 7 0 0 0
par_command_len_shellquote -Slo -j10 ' 7 8 0 0 0 par_command_len_shellquote -Slo -j10 ' 7 8 0 0 0
par_command_len_shellquote -Slo -j10 ' 7 9 0 0 0 par_command_len_shellquote -Slo -j10 ' 7 9 0 0 0
par_command_len_shellquote -Slo -j10 ' 7 10 0 0 0 par_command_len_shellquote -Slo -j10 ' 7 10 0 0 0
par_command_len_shellquote -Slo -j10 ' 8 1 1 1 39 par_command_len_shellquote -Slo -j10 ' 8 1 1 1 11
par_command_len_shellquote -Slo -j10 ' 8 2 1 1 129 par_command_len_shellquote -Slo -j10 ' 8 2 1 1 17
par_command_len_shellquote -Slo -j10 ' 8 3 1 1 399 par_command_len_shellquote -Slo -j10 ' 8 3 1 1 35
par_command_len_shellquote -Slo -j10 ' 8 4 1 1 1209 par_command_len_shellquote -Slo -j10 ' 8 4 1 1 89
par_command_len_shellquote -Slo -j10 ' 8 5 1 1 3639 par_command_len_shellquote -Slo -j10 ' 8 5 1 1 251
par_command_len_shellquote -Slo -j10 ' 8 6 1 1 10xxx par_command_len_shellquote -Slo -j10 ' 8 6 1 1 737
par_command_len_shellquote -Slo -j10 ' 8 7 0 0 0 par_command_len_shellquote -Slo -j10 ' 8 7 0 0 0
par_command_len_shellquote -Slo -j10 ' 8 8 0 0 0 par_command_len_shellquote -Slo -j10 ' 8 8 0 0 0
par_command_len_shellquote -Slo -j10 ' 8 9 0 0 0 par_command_len_shellquote -Slo -j10 ' 8 9 0 0 0
par_command_len_shellquote -Slo -j10 ' 8 10 0 0 0 par_command_len_shellquote -Slo -j10 ' 8 10 0 0 0
par_command_len_shellquote -Slo -j10 ' 9 1 1 1 44 par_command_len_shellquote -Slo -j10 ' 9 1 1 1 12
par_command_len_shellquote -Slo -j10 ' 9 2 1 1 146 par_command_len_shellquote -Slo -j10 ' 9 2 1 1 18
par_command_len_shellquote -Slo -j10 ' 9 3 1 1 452 par_command_len_shellquote -Slo -j10 ' 9 3 1 1 36
par_command_len_shellquote -Slo -j10 ' 9 4 1 1 1370 par_command_len_shellquote -Slo -j10 ' 9 4 1 1 90
par_command_len_shellquote -Slo -j10 ' 9 5 1 1 4124 par_command_len_shellquote -Slo -j10 ' 9 5 1 1 252
par_command_len_shellquote -Slo -j10 ' 9 6 1 1 12xxx par_command_len_shellquote -Slo -j10 ' 9 6 1 1 738
par_command_len_shellquote -Slo -j10 ' 9 7 0 0 0 par_command_len_shellquote -Slo -j10 ' 9 7 0 0 0
par_command_len_shellquote -Slo -j10 ' 9 8 0 0 0 par_command_len_shellquote -Slo -j10 ' 9 8 0 0 0
par_command_len_shellquote -Slo -j10 ' 9 9 0 0 0 par_command_len_shellquote -Slo -j10 ' 9 9 0 0 0
par_command_len_shellquote -Slo -j10 ' 9 10 0 0 0 par_command_len_shellquote -Slo -j10 ' 9 10 0 0 0
par_command_len_shellquote -Slo -j10 ' 10 1 1 1 49 par_command_len_shellquote -Slo -j10 ' 10 1 1 1 13
par_command_len_shellquote -Slo -j10 ' 10 2 1 1 163 par_command_len_shellquote -Slo -j10 ' 10 2 1 1 19
par_command_len_shellquote -Slo -j10 ' 10 3 1 1 505 par_command_len_shellquote -Slo -j10 ' 10 3 1 1 37
par_command_len_shellquote -Slo -j10 ' 10 4 1 1 1531 par_command_len_shellquote -Slo -j10 ' 10 4 1 1 91
par_command_len_shellquote -Slo -j10 ' 10 5 1 1 4609 par_command_len_shellquote -Slo -j10 ' 10 5 1 1 253
par_command_len_shellquote -Slo -j10 ' 10 6 1 1 13xxx par_command_len_shellquote -Slo -j10 ' 10 6 1 1 739
par_command_len_shellquote -Slo -j10 ' 10 7 0 0 0 par_command_len_shellquote -Slo -j10 ' 10 7 0 0 0
par_command_len_shellquote -Slo -j10 ' 10 8 0 0 0 par_command_len_shellquote -Slo -j10 ' 10 8 0 0 0
par_command_len_shellquote -Slo -j10 ' 10 9 0 0 0 par_command_len_shellquote -Slo -j10 ' 10 9 0 0 0
@ -397,91 +397,91 @@ par_command_len_shellquote ' 1 7 1 2 2190
par_command_len_shellquote ' 1 8 0 0 0 par_command_len_shellquote ' 1 8 0 0 0
par_command_len_shellquote ' 1 9 0 0 0 par_command_len_shellquote ' 1 9 0 0 0
par_command_len_shellquote ' 1 10 0 0 0 par_command_len_shellquote ' 1 10 0 0 0
par_command_len_shellquote ' 2 1 1 2 12 par_command_len_shellquote ' 2 1 1 2 8
par_command_len_shellquote ' 2 2 1 2 30 par_command_len_shellquote ' 2 2 1 2 14
par_command_len_shellquote ' 2 3 1 2 84 par_command_len_shellquote ' 2 3 1 2 32
par_command_len_shellquote ' 2 4 1 2 246 par_command_len_shellquote ' 2 4 1 2 86
par_command_len_shellquote ' 2 5 1 2 732 par_command_len_shellquote ' 2 5 1 2 248
par_command_len_shellquote ' 2 6 1 2 2190 par_command_len_shellquote ' 2 6 1 2 734
par_command_len_shellquote ' 2 7 1 2 6564 par_command_len_shellquote ' 2 7 1 2 2192
par_command_len_shellquote ' 2 8 0 0 0 par_command_len_shellquote ' 2 8 0 0 0
par_command_len_shellquote ' 2 9 0 0 0 par_command_len_shellquote ' 2 9 0 0 0
par_command_len_shellquote ' 2 10 0 0 0 par_command_len_shellquote ' 2 10 0 0 0
par_command_len_shellquote ' 3 1 1 2 18 par_command_len_shellquote ' 3 1 1 2 10
par_command_len_shellquote ' 3 2 1 2 48 par_command_len_shellquote ' 3 2 1 2 16
par_command_len_shellquote ' 3 3 1 2 138 par_command_len_shellquote ' 3 3 1 2 34
par_command_len_shellquote ' 3 4 1 2 408 par_command_len_shellquote ' 3 4 1 2 88
par_command_len_shellquote ' 3 5 1 2 1218 par_command_len_shellquote ' 3 5 1 2 250
par_command_len_shellquote ' 3 6 1 2 3648 par_command_len_shellquote ' 3 6 1 2 736
par_command_len_shellquote ' 3 7 0 0 0 par_command_len_shellquote ' 3 7 0 0 0
par_command_len_shellquote ' 3 8 0 0 0 par_command_len_shellquote ' 3 8 0 0 0
par_command_len_shellquote ' 3 9 0 0 0 par_command_len_shellquote ' 3 9 0 0 0
par_command_len_shellquote ' 3 10 0 0 0 par_command_len_shellquote ' 3 10 0 0 0
par_command_len_shellquote ' 4 1 1 2 24 par_command_len_shellquote ' 4 1 1 2 12
par_command_len_shellquote ' 4 2 1 2 66 par_command_len_shellquote ' 4 2 1 2 18
par_command_len_shellquote ' 4 3 1 2 192 par_command_len_shellquote ' 4 3 1 2 36
par_command_len_shellquote ' 4 4 1 2 570 par_command_len_shellquote ' 4 4 1 2 90
par_command_len_shellquote ' 4 5 1 2 1704 par_command_len_shellquote ' 4 5 1 2 252
par_command_len_shellquote ' 4 6 1 2 5106 par_command_len_shellquote ' 4 6 1 2 738
par_command_len_shellquote ' 4 7 0 0 0 par_command_len_shellquote ' 4 7 0 0 0
par_command_len_shellquote ' 4 8 0 0 0 par_command_len_shellquote ' 4 8 0 0 0
par_command_len_shellquote ' 4 9 0 0 0 par_command_len_shellquote ' 4 9 0 0 0
par_command_len_shellquote ' 4 10 0 0 0 par_command_len_shellquote ' 4 10 0 0 0
par_command_len_shellquote ' 5 1 1 2 30 par_command_len_shellquote ' 5 1 1 2 14
par_command_len_shellquote ' 5 2 1 2 84 par_command_len_shellquote ' 5 2 1 2 20
par_command_len_shellquote ' 5 3 1 2 246 par_command_len_shellquote ' 5 3 1 2 38
par_command_len_shellquote ' 5 4 1 2 732 par_command_len_shellquote ' 5 4 1 2 92
par_command_len_shellquote ' 5 5 1 2 2190 par_command_len_shellquote ' 5 5 1 2 254
par_command_len_shellquote ' 5 6 1 2 6564 par_command_len_shellquote ' 5 6 1 2 740
par_command_len_shellquote ' 5 7 0 0 0 par_command_len_shellquote ' 5 7 0 0 0
par_command_len_shellquote ' 5 8 0 0 0 par_command_len_shellquote ' 5 8 0 0 0
par_command_len_shellquote ' 5 9 0 0 0 par_command_len_shellquote ' 5 9 0 0 0
par_command_len_shellquote ' 5 10 0 0 0 par_command_len_shellquote ' 5 10 0 0 0
par_command_len_shellquote ' 6 1 1 2 36 par_command_len_shellquote ' 6 1 1 2 16
par_command_len_shellquote ' 6 2 1 2 102 par_command_len_shellquote ' 6 2 1 2 22
par_command_len_shellquote ' 6 3 1 2 300 par_command_len_shellquote ' 6 3 1 2 40
par_command_len_shellquote ' 6 4 1 2 894 par_command_len_shellquote ' 6 4 1 2 94
par_command_len_shellquote ' 6 5 1 2 2676 par_command_len_shellquote ' 6 5 1 2 256
par_command_len_shellquote ' 6 6 1 2 8022 par_command_len_shellquote ' 6 6 1 2 742
par_command_len_shellquote ' 6 7 0 0 0 par_command_len_shellquote ' 6 7 0 0 0
par_command_len_shellquote ' 6 8 0 0 0 par_command_len_shellquote ' 6 8 0 0 0
par_command_len_shellquote ' 6 9 0 0 0 par_command_len_shellquote ' 6 9 0 0 0
par_command_len_shellquote ' 6 10 0 0 0 par_command_len_shellquote ' 6 10 0 0 0
par_command_len_shellquote ' 7 1 1 2 42 par_command_len_shellquote ' 7 1 1 2 18
par_command_len_shellquote ' 7 2 1 2 120 par_command_len_shellquote ' 7 2 1 2 24
par_command_len_shellquote ' 7 3 1 2 354 par_command_len_shellquote ' 7 3 1 2 42
par_command_len_shellquote ' 7 4 1 2 1056 par_command_len_shellquote ' 7 4 1 2 96
par_command_len_shellquote ' 7 5 1 2 3162 par_command_len_shellquote ' 7 5 1 2 258
par_command_len_shellquote ' 7 6 1 2 9480 par_command_len_shellquote ' 7 6 1 2 744
par_command_len_shellquote ' 7 7 0 0 0 par_command_len_shellquote ' 7 7 0 0 0
par_command_len_shellquote ' 7 8 0 0 0 par_command_len_shellquote ' 7 8 0 0 0
par_command_len_shellquote ' 7 9 0 0 0 par_command_len_shellquote ' 7 9 0 0 0
par_command_len_shellquote ' 7 10 0 0 0 par_command_len_shellquote ' 7 10 0 0 0
par_command_len_shellquote ' 8 1 1 2 48 par_command_len_shellquote ' 8 1 1 2 20
par_command_len_shellquote ' 8 2 1 2 138 par_command_len_shellquote ' 8 2 1 2 26
par_command_len_shellquote ' 8 3 1 2 408 par_command_len_shellquote ' 8 3 1 2 44
par_command_len_shellquote ' 8 4 1 2 1218 par_command_len_shellquote ' 8 4 1 2 98
par_command_len_shellquote ' 8 5 1 2 3648 par_command_len_shellquote ' 8 5 1 2 260
par_command_len_shellquote ' 8 6 1 2 10xxx par_command_len_shellquote ' 8 6 1 2 746
par_command_len_shellquote ' 8 7 0 0 0 par_command_len_shellquote ' 8 7 0 0 0
par_command_len_shellquote ' 8 8 0 0 0 par_command_len_shellquote ' 8 8 0 0 0
par_command_len_shellquote ' 8 9 0 0 0 par_command_len_shellquote ' 8 9 0 0 0
par_command_len_shellquote ' 8 10 0 0 0 par_command_len_shellquote ' 8 10 0 0 0
par_command_len_shellquote ' 9 1 1 2 54 par_command_len_shellquote ' 9 1 1 2 22
par_command_len_shellquote ' 9 2 1 2 156 par_command_len_shellquote ' 9 2 1 2 28
par_command_len_shellquote ' 9 3 1 2 462 par_command_len_shellquote ' 9 3 1 2 46
par_command_len_shellquote ' 9 4 1 2 1380 par_command_len_shellquote ' 9 4 1 2 100
par_command_len_shellquote ' 9 5 1 2 4134 par_command_len_shellquote ' 9 5 1 2 262
par_command_len_shellquote ' 9 6 0 0 0 par_command_len_shellquote ' 9 6 0 0 0
par_command_len_shellquote ' 9 7 0 0 0 par_command_len_shellquote ' 9 7 0 0 0
par_command_len_shellquote ' 9 8 0 0 0 par_command_len_shellquote ' 9 8 0 0 0
par_command_len_shellquote ' 9 9 0 0 0 par_command_len_shellquote ' 9 9 0 0 0
par_command_len_shellquote ' 9 10 0 0 0 par_command_len_shellquote ' 9 10 0 0 0
par_command_len_shellquote ' 10 1 1 2 60 par_command_len_shellquote ' 10 1 1 2 24
par_command_len_shellquote ' 10 2 1 2 174 par_command_len_shellquote ' 10 2 1 2 30
par_command_len_shellquote ' 10 3 1 2 516 par_command_len_shellquote ' 10 3 1 2 48
par_command_len_shellquote ' 10 4 1 2 1542 par_command_len_shellquote ' 10 4 1 2 102
par_command_len_shellquote ' 10 5 1 2 4620 par_command_len_shellquote ' 10 5 1 2 264
par_command_len_shellquote ' 10 6 0 0 0 par_command_len_shellquote ' 10 6 0 0 0
par_command_len_shellquote ' 10 7 0 0 0 par_command_len_shellquote ' 10 7 0 0 0
par_command_len_shellquote ' 10 8 0 0 0 par_command_len_shellquote ' 10 8 0 0 0