+
+ my ( $cmd, $arg ) = ( $1, $2 );
+ print $diff_tool_tmp_fh "$line\n" if ( $diff_tool and $cmd ne '>' );
+ $arg =~ s/^ //g;
+ $arg =~ s/\r//g;
+ $arg =~ s/\\\\/\\/g;
+
+ # handle the commands
+ if ( $cmd =~ /^#/ ) { # comment
+ } elsif ( $cmd eq '>' ) { # expected result line
+ print "[TESH/debug] push expected result\n" if $opts{'debug'};
+ push @{ $cmd{'out'} }, $arg;
+
+ } elsif ( $cmd eq '<' ) { # provided input
+ print "[TESH/debug] push provided input\n" if $opts{'debug'};
+ push @{ $cmd{'in'} }, $arg;
+
+ } elsif ( $cmd eq 'p' ) { # comment
+ print "[$tesh_name:$line_num] $arg\n";
+
+ } elsif ( $cmd eq '$' ) { # Command
+ # if we have something buffered, run it now
+ if ( defined( $cmd{'cmd'} ) ) {
+ exec_cmd( \%cmd );
+ %cmd = ();
+ }
+ if ( $arg =~ /^\s*mkfile / ) { # "mkfile" command line
+ die "[TESH/CRITICAL] Output expected from mkfile command!\n"
+ if scalar @{ cmd { 'out' } };
+
+ $cmd{'arg'} = $arg;
+ $cmd{'arg'} =~ s/\s*mkfile //;
+ mkfile_cmd( \%cmd );
+ %cmd = ();
+
+ } elsif ( $arg =~ /^\s*cd / ) {
+ die "[TESH/CRITICAL] Input provided to cd command!\n"
+ if scalar @{ cmd { 'in' } };
+ die "[TESH/CRITICAL] Output expected from cd command!\n"
+ if scalar @{ cmd { 'out' } };
+
+ $arg =~ s/^ *cd //;
+ cd_cmd( "", $arg );
+ %cmd = ();
+
+ } else { # regular command
+ $cmd{'cmd'} = $arg;
+ $cmd{'file'} = $tesh_file;
+ $cmd{'line'} = $line_num;
+ }
+ } elsif ( $cmd eq '&' ) { # parallel command line
+
+ if ( defined( $cmd{'cmd'} ) ) {
+ exec_cmd( \%cmd );
+ %cmd = ();
+ }
+ $cmd{'background'} = 1;
+ $cmd{'cmd'} = $arg;
+ $cmd{'file'} = $tesh_file;
+ $cmd{'line'} = $line_num;
+ } elsif ( $line =~ /^!\s*output sort/ ) { #output sort
+ if ( defined( $cmd{'cmd'} ) ) {
+ exec_cmd( \%cmd );
+ %cmd = ();
+ }
+ $cmd{'sort'} = 1;
+ if ( $line =~ /^!\s*output sort\s+(\d+)/ ) {
+ $sort_prefix = $1;
+ }
+ } elsif ( $line =~ /^!\s*output ignore/ ) { #output ignore
+ if ( defined( $cmd{'cmd'} ) ) {
+ exec_cmd( \%cmd );
+ %cmd = ();
+ }
+ $cmd{'output ignore'} = 1;
+ } elsif ( $line =~ /^!\s*output display/ ) { #output display
+ if ( defined( $cmd{'cmd'} ) ) {
+ exec_cmd( \%cmd );
+ %cmd = ();
+ }
+ $cmd{'output display'} = 1;
+ } elsif ( $line =~ /^!\s*expect signal (\w*)/ ) { #expect signal SIGABRT
+ if ( defined( $cmd{'cmd'} ) ) {
+ exec_cmd( \%cmd );
+ %cmd = ();
+ }
+ print "hey\n";
+ $cmd{'expect'} = "$1";
+ } elsif ( $line =~ /^!\s*expect return/ ) { #expect return
+ if ( defined( $cmd{'cmd'} ) ) {
+ exec_cmd( \%cmd );
+ %cmd = ();
+ }
+ $line =~ s/^! expect return //g;
+ $line =~ s/\r//g;
+ $cmd{'return'} = $line;
+ } elsif ( $line =~ /^!\s*setenv/ ) { #setenv
+ if ( defined( $cmd{'cmd'} ) ) {
+ exec_cmd( \%cmd );
+ %cmd = ();
+ }
+ $line =~ s/^! setenv //g;
+ $line =~ s/\r//g;
+ setenv_cmd($line);
+ } elsif ( $line =~ /^!\s*include/ ) { #include
+ if ( defined( $cmd{'cmd'} ) ) {
+ exec_cmd( \%cmd );
+ %cmd = ();
+ }
+ print color("red"), "[Tesh/CRITICAL] need include";
+ print color("reset"), "\n";
+ die;
+ } elsif ( $line =~ /^!\s*timeout/ ) { #timeout
+ if ( defined( $cmd{'cmd'} ) ) {
+ exec_cmd( \%cmd );
+ %cmd = ();
+ }
+ $line =~ s/^! timeout //;
+ $line =~ s/\r//g;
+ $cmd{'timeout'} = $line;
+ } else {
+ die "[TESH/CRITICAL] parse error: $line\n";