From 6061556d3904c612f73cdc699bfab1ac5be7bb85 Mon Sep 17 00:00:00 2001 From: Adolfo Perez Alvarez Date: Fri, 28 Nov 2025 18:12:06 +0100 Subject: [PATCH] Add shell expansion for output lines Do shell expansion for output lines (|, @ and ?), so that it is possible to evaluate arbitrary shell expressions. Other fixes included: - Don't assume ksh is in bin. - Eval commands using the standard shell instead of ksh. - Make sure we delete temp files; also avoid creating a temp file per line. - Don't print ? output if return status is 0. - Fix literal \? match when evaluating lines. --- ts | 43 +++++++++++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/ts b/ts index fac46b4..a8502fc 100755 --- a/ts +++ b/ts @@ -1,18 +1,14 @@ -#!/bin/ksh +#!/usr/bin/env ksh function tsrun { - typeset err out ret + typeset ret - err=$(mktemp /tmp/XXXXXXXXXX) - out=$(mktemp /tmp/XXXXXXXXXX) - trap "rm $err $out" EXIT - - eval "$@" >$out 2>$err + sh -c "$@" >$out 2>$err ret=$? sed 's/^/| /' $out sed 's/^/@ /' $err - print '? '$ret + (( ret != 0 )) && print "? $ret" } function tseval @@ -26,15 +22,37 @@ function tseval print "$ln" tsrun "${ln#$}" ;; - !(?|@|\|)) + !(\?|@|\|)) print "$ln" ;; esac done } +function tsexpand +{ + typeset ln + + while read ln + do + case ${ln%% *} + in + \?|@|\|) + eval print \""$ln"\" + ;; + *) + print "$ln" + ;; + esac + done +} + (( $# == 0 )) && exit 64 +err=$(mktemp /tmp/XXXXXXXXXX) +out=$(mktemp /tmp/XXXXXXXXXX) +trap "rm $err $out" HUP INT QUIT TERM + if [[ $1 = -b ]] then (( $# == 1 )) && exit 64 @@ -45,8 +63,13 @@ then (rm $fn && tseval >$fn) <$fn done else + exp=$(mktemp /tmp/XXXXXXXXXX) + trap "rm $exp" HUP INT QUIT TERM for fn do - tseval <$fn | diff -u $fn - + tsexpand <$fn >$exp + tseval <$fn | diff -u $exp - done + rm $exp fi +rm $err $out