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.
This commit is contained in:
43
ts
43
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,7 +22,25 @@ 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
|
||||
@@ -35,6 +49,10 @@ function tseval
|
||||
|
||||
(( $# == 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
|
||||
|
||||
Reference in New Issue
Block a user