On 11/15/2010 08:33 AM, Stefan Berger wrote:
I am converting the shell-scripted tap tests to also run using the
dash
shell, fixing some other problems on the way as well.
Two of the tests' data files contained '\\1' in an sed command. This
created char(1) with the dash, '\1' with the bash. I found it easier to
replace the sed command with a different one than figuring out how to
solve this escape problem so it works for both shells.
-function tap_fail() {
- echo "not ok $1 - ${2:0:66}"
- TAP_FAIL_LIST+="$1 "
- ((TAP_FAIL_CTR++))
- ((TAP_TOT_CTR++))
+tap_fail() {
+ txt=$(echo "$2" | gawk '{print substr($0,1,66)}')
+ echo "not ok $1 - ${txt}"
+ TAP_FAIL_LIST="$TAP_FAIL_LIST $1 "
+ TAP_FAIL_CTR=$((TAP_FAIL_CTR+1))
Older versions of dash have a bug where you have to pre-expand a
variable to get this to work:
TAP_FAIL_CTR=$(($TAP_FAIL_CTR + 1))
(throughout the patch)
@@ -112,8 +111,8 @@ function checkExpectedOutput() {
exec 4<"${datafile}"
- read <&4
- line="${REPLY}"
+ IFS=""
Where do you restore IFS back to its original space-tab-newline setting?
while :; do
- read <&4
- line="${REPLY}"
+ read line <&4
+
+ letter=$(echo ${line} | gawk '{print substr($1,1,1)}')
- if [ "${line:0:1}" == "#" ] || [ "x${line}x" ==
"xx" ]; then
+ if [ "x${letter}x" = "x#x" ] || [ "x${line}x" =
"xx" ]; then
Rather than wasting a $() and gawk subprocess to compute $letter, you
can use the much more efficient:
case $line in
'#'*) # line started with #
;;
*) # line did not start with #
;;
esac
@@ -327,13 +320,13 @@ function main() {
fi
if [ $((flags & FLAG_LIBVIRT_TEST)) -ne 0 ]; then
- pushd "${PWD}" > /dev/null
+ curdir="${PWD}"
. ./test-lib.sh
if [ $? -ne 0 ]; then
exit 1
fi
test_intro $this_test
- popd > /dev/null
+ cd "${curdir}"
You really should check whether cd succeeds; as failure to return to the
parent directory deserves aborting the script to avoid corrupting
unintended files in a different directory.
Index: libvirt-tck/scripts/networks/100-apply-verify-host.t
===================================================================
--- libvirt-tck.orig/scripts/networks/100-apply-verify-host.t
+++ libvirt-tck/scripts/networks/100-apply-verify-host.t
@@ -1,10 +1,5 @@
-#!/bin/bash
+#!/bin/sh
pwd=$(dirname $0)
-pushd ${PWD} > /dev/null
-
-cd ${pwd}
-bash ./networkApplyTest.sh --tap-test
-
-popd > /dev/null
+(cd ${pwd}; sh ./networkApplyTest.sh --tap-test)
To be robust to starting the script via a relative pathname that starts
with -, I'd write this as:
pwd=$(dirname -- "$0")
(cd -- "${pwd}" && sh ./networkApplyTest.sh --tap-test
Index:
libvirt-tck/scripts/networks/networkxml2hostout/tck-testnet-1.dat
===================================================================
--- libvirt-tck.orig/scripts/networks/networkxml2hostout/tck-testnet-1.dat
+++ libvirt-tck/scripts/networks/networkxml2hostout/tck-testnet-1.dat
@@ -5,7 +5,7 @@ MASQUERADE all -- 10.1.2.0/24
#iptables -n -L FORWARD | grep ' 10\\.1\\.2\\.'
ACCEPT all -- 0.0.0.0/0 10.1.2.0/24 state RELATED,ESTABLISHED
ACCEPT all -- 10.1.2.0/24 0.0.0.0/0
-#ps aux | sed -n '/dnsmasq .*10\\.1\\.2\\./
s|.*\\(dnsmasq[[:print:]*]\\)|\\1|p'
+#ps aux | sed -n '/dnsmasq .*10\\.1\\.2\\./ s|.*dnsmasq|dnsmasq|p'
Hmm; you used 'read' to read in these lines, but unless you use 'read
-r', that means that backslash interpolation is taking place in the
shell. 'read -r' is portable to POSIX (and therefore dash), even if it
is not portable to generic /bin/sh (but we already have lots of other
things that are not portable to generic /bin/sh that aren't worth
fretting about, since we can assume that the nwfilter tests only make
sense on Linux where /bin/sh will mostly conform to POSIX). Maybe it's
better to fix the driver scripts to use 'read -r', at which point these
lines could use single \, while at the same time working around the
problem you were seeing where dash interpolated \1 inside "" into char(1).
--
Eric Blake eblake(a)redhat.com +1-801-349-2682
Libvirt virtualization library
http://libvirt.org