TickTick
TickTick copied to clipboard
"Portable" (no debug magic) mode using HERE-documents (<<'EOF')
A lot of people are requesting ticktick for some other shell xsh where debug facilities may be nonexistent. A way to get that job done is to write a function that reads from its stdin, transpiles the code, and runs eval
-- no caller magic needed! It's going to work in interactive shells too!
# The function should look like this...
tt() {
eval "$(__tick_fun_tokenize_expression | __tick_fun_parse_expression)"
}
# don't ask me about disabling the rest of the magic i don't know okay?
People can then write blocks of JSON for that in here-documents and one-line here-strings. They are a bit more tedious, but that is expected. For example, instead of the example, we can say:
#!/bin/bash
TICKTICK_NOMAGIC=1
. ticktick.sh
bob=Bob
tt <<'EOF'
people = {
"HR" : [
"Alice",
$bob,
"Carol"
],
"Sales": {
"Gale": { "profits" : 1000 },
"Harry": { "profits" : 500 }
}
}
EOF
function printEmployees() {
echo
echo " The $(tt <<< 'people.Engineering.length()') Employees listed are:"
for employee in $(tt <<< 'people.Engineering.items()'); do
printf " - %s\n" ${!employee}
done
echo
}
echo Base Assignment
tt <<< 'people.Engineering = [ "Darren", "Edith", "Frank" ]'
printEmployees
newPerson=Isaac
echo Pushed a new element by variable, $newPerson onto the array
tt <<< 'people.Engineering.push($newPerson)'
printEmployees
echo Shifted the first element off: $(tt <<< 'people.Engineering.shift()')
printEmployees
echo Popped the last value off: $(tt <<< 'people.Engineering.pop()')
printEmployees
echo Indexing an array, doing variable assignments
person0=$(tt <<< 'people.HR[0]')
echo $person0 $(tt <<< 'people.HR[1]')
(Note the quotes on EOF -- that prevents the shell from expanding $bob
on its own prematurely. And the quotes on ()
, because when they poke out they make a syntax error. The quotes on [0]
is there because it can mean a glob, and you don't want to risk having a file called people.HR0 and messing this up.)
- If you are going interactive, you can even type
tt
, paste stuff in, and Ctrl-D it. The possibilties are limitless! - People can put positional arguments in by calling
tt
astt "$@"
, although I don't see much use for that. If they really want that, they can make analias tta='tt "$@"'
and make it work in scripts withshopt -s expand_aliases
. (Aliases are wonderful; they are like macros for bash, lmao.) - We can write another function
ttl() { printf %s "$1" | tt "${@:2}"; }
, just for typing less<<<
.