From 4307949091743c6d697c93011a72f7739e4c0bda Mon Sep 17 00:00:00 2001 From: Ole Tange Date: Mon, 30 Jan 2023 22:21:40 +0100 Subject: [PATCH] asciinema-manuscript: Initial release. --- src/asciinema-manuscript | 142 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100755 src/asciinema-manuscript diff --git a/src/asciinema-manuscript b/src/asciinema-manuscript new file mode 100755 index 00000000..183d8e9b --- /dev/null +++ b/src/asciinema-manuscript @@ -0,0 +1,142 @@ +#!/bin/bash + +# Copyright (C) 2007-2022 Ole Tange, http://ole.tange.dk and Free +# Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see +# or write to the Free Software Foundation, Inc., 51 Franklin St, +# Fifth Floor, Boston, MA 02110-1301 USA +# +# SPDX-FileCopyrightText: 2021-2022 Ole Tange, http://ole.tange.dk and Free Software and Foundation, Inc. +# SPDX-License-Identifier: GPL-3.0-or-later + +# tty1: asciinema rec demo.cast +# tty2: asciinema-manuscript +# Run commands in tty2 to set clipboard to next command + +manuscript() { + # sleep this many seconds before executing command + cat <<'_' +### +# Definitions +PS1='$ ' +S() { sleep $@; } +T() { echo -n '$ '; sleep $@; echo; } +# Wait for asciinema to read all input +sleep 5 +### +S 0; # Make some files +S 3; seq 100 | parallel --bar seq {}0000 '>' file-{} +T 1; +S 0; # gzip files with -1 .. -7 Note how all combinations are made +S 3; parallel --bar gzip {1} '<{2}' '>{2}{1}.gz' ::: -{1..7} ::: * +T 1; +S 0; # Count the bytes in some files. Each job gets its own color +S 3; parallel --color --tag wc {} ::: file-99* +T 1; +S 0; # Remove .gz-files +S 3; rm *.gz +T 1; +S 0; # Make a big file +S 3; seq 10000000 > bigfile +T 1; +S 0; # Chop bigfile into parts with 100000 lines (slow) +S 3; cat bigfile | parallel --pipe -n100000 cat '>lines-{#}' +S 3; ls lines-* +T 1; +S 0; # Chop bigfile into parts each ~10mb (faster) +S 3; cat bigfile | parallel --pipe --block 10m cat '>10mb-{#}' +S 3; ls -l 10mb-* +T 1; +S 0; # Chop bigfile into one part per CPU thread (fastest) +S 3; parallel --pipepart -a bigfile --block -1 \ + cat '>thread-part-{#}' +S 3; ls -l thread-part-* +T 1; +S 0; # Chop bigfile into one part per CPU thread - chop at 000\n +S 3; parallel --pipepart -a bigfile --block -1 --recend '000\n' \ + cat '>p000-{#}' +S 3; head -1 p000-* +T 1; +S 0; # Rename all files to UPPERCASE using a {= perl expr =} +S 3; parallel mv {} {= tr/a-z/A-Z/ =} ::: * +S 3; ls +T 1; +S 0; # Move files into dirs named after the last char in the name +S 3; parallel 'mkdir -p {= $_=chop =}; mv {} {= $_=chop =}' ::: * +S 3; ls +T 1; +S 0; # Zip dirs into files +S 3; parallel --ll --color --tag zip -r '{= s:/$:: =}'.zip {} ::: */ +T 1; +S 0; # Remove the dirs +S 3; rm -r */ +T 1; +S 0; # Unzip zip files into dirs +S 3; parallel --ll --tag 'mkdir {.}; cd {.}; unzip ../{}' ::: *.zip +T 1; +S 0; # Remove zip and dirs +S 3; rm -r *.zip ? +T 1; +S 0; # Paint output of the failing commands +S 3; parallel --colorfailed echo Arg:{} ';' exit {} ::: 0 0 1 2 0 +T 1; +S 0; # Use a bash function with one argument +doit() { + echo Doing it for $1 + sleep 2 + echo Done with $1 +} +export -f doit +S 3; parallel doit ::: 1 2 3 +T 1; +S 0; # Use a bash function with two argument +doubleit() { + echo Doing it for $1 $2 + sleep 2 + echo Done with $1 $2 +} +export -f doubleit +S 3; parallel doubleit ::: 1 2 3 ::: a b +T 1; +S 0; # Make some logfiles +S 1; touch log +S 3; parallel seq {} '>' log.{} ::: {1..10} +S 3; ls -l +T 1; +S 0; # Simple log rotate +S 3; seq 9 -1 1 | parallel -j1 mv log.{} log.'{= $_++ =}' +S 1; mv log log.1 +S 3; ls -l +T 1; +S 0; # Monitor progress of multiple jobs in parallel +slowseq() { seq "$@" | pv -qL 20; } +export -f slowseq +S 3; parallel --ll --color --tag slowseq {} ::: 150 {1..60} +T 3; +### +exit +_ +} + +pwd=$(pwd) +tmp=$(mktemp -d) +cd "$tmp" && + manuscript | + parallel -j1 echo '{= s/^(\d+)\s/sleep($1);""/e; =}' | + asciinema rec - | + perl -ne 's/[ST] \d;\s?//; + /###/ and $mark++ and next; + ($mark == 0 or $mark == 5) and print; + ' > "$pwd"/parallel.cast