#!/usr/bin/env nu # Compare one shell script with bash. Keep both streams and exact exit codes. def main [host: path, shell: path] { let base = '/tmp/s2-shell/comparison' mkdir $base for name in [native guest] { let root = ($base | path join $name) mkdir ($root | path join work sub) ($root | path join other) ($root | path join bin) ($root | path join dev) "alpha\n" | save -f ($root | path join work f) "one\ntwo\n" | save -f ($root | path join work file) '' | save -f ($root | path join work a.txt) '' | save -f ($root | path join work b.txt) "before\n" | save -f ($root | path join work log) '' | save -f ($root | path join dev 'null') for tool in [cat tr ls wc yes head] { cp --force ($env.FILE_PWD | path join userland target wasm32-wasip2 release s2-userland.wasm) ($root | path join bin $tool) } } let script = (open --raw ($env.FILE_PWD | path join corpus.sh)) let native_root = ($base | path join native) let native = (do { cd $native_root; ^bash --noprofile --norc -c $script } | complete) let stdout = ($native.stdout | str replace --all $native_root '') $stdout | save -f ($base | path join native.stdout) $native.stderr | save -f ($base | path join native.stderr) print $'native exit=($native.exit_code)' let start = (date now) let guest = (^$host ($base | path join guest) $shell -c $script | complete) print $'guest elapsed=((date now) - $start)' $guest.stdout | save -f ($base | path join guest.stdout) $guest.stderr | save -f ($base | path join guest.stderr) print $'guest exit=($guest.exit_code)' print $'equal stdout=($stdout == $guest.stdout)' print '--- native stdout ---' print $stdout print '--- guest stdout ---' print $guest.stdout print '--- guest stderr ---' print $guest.stderr if $native.exit_code != $guest.exit_code or $stdout != $guest.stdout { error make {msg: 'shell comparison failed'} } }