Faire des qcm simplement - retour accueil
git clone git://bebou.netlib.re/qcm
Log | Files | Refs | README |
commit 577033b1740aba8fad62e6d9103b9d298818b357 parent 467c40aa9f1969e349bde00c60db43a47c3d0670 Auteurice: Arthur Pons <arthur.pons@unistra.fr> Date: Thu, 26 Dec 2024 16:21:10 +0100 Portabilité openbsd Deux points en particulier : 1. Le sh d'openbsd n'inclu pas "local". Je savais que c'était pas posix mais je m'étais laissé entendre dire qu'il était très rare que local n'existe pas dans les sh des différents systèmes. On m'a donc menti et mon coeur n'est plus ouvert. Le fix que j'ai retenu ajoute une variable pour distinguer la plotcmd générale de tout le questionnaire et celle effectivement utilisée pour une question en particulier. 2. le paste de gnu et celui de linux ne font pas la même chose lorsque l'on paste -s -d'\0' - Sur openbsd cela ajoute des caractères entre chaque cara et il faudrait les tr ensuite. A la place je retiens la solution de suppr tous les retours à la ligne puis de rajouter celui retiré à la fin. Diffstat:
M | README | | | 2 | +- |
M | qcm.sh | | | 20 | ++++++++++---------- |
2 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/README b/README @@ -15,7 +15,7 @@ sur une autre variante Unix-like. ## Dépendances - * un shell posix + local (testé avec dash et le sh d'openbsd) + * un shell posix (testé avec dash et le sh d'openbsd) * un `mktemp` avec `-d` * un `grep` avec `--line-buffered` (GNU grep ou openbsd grep par ex) * un `sed` posix diff --git a/qcm.sh b/qcm.sh @@ -60,14 +60,14 @@ gnuplot -e " calcandshow() { - local plotcmd hide; plotcmd="$1";hide="$2" + plotcmd="$1";hide="$2" if [ -z "$uniqueanswers" ];then tot=0 else if [ -n "$hide" ];then groupedanswers= else if [ "$type" != "ouverte" ] && [ "$type" != "regex" ];then - sortanswers='while read line;do echo "$line" | grep -o . | sort -u | paste -s -d "\0" -;done' + sortanswers='while read line;do echo "$line" | grep -o . | sort -u | tr -d "\n";printf "\n";done' else sortanswers='cat' fi groupedanswers=$(echo "$uniqueanswers" | @@ -75,7 +75,7 @@ calcandshow() { eval $sortanswers | sed 's,%\([0-9A-F][0-9A-F]\),\\\\\x\1,g' | xargs printf "%b\n" | grep -v "^$" | - sort | uniq -c | sort -rn | $plotcmd ) + sort | uniq -c | sort -rn | $qplotcmd ) fi tot=$(echo "$uniqueanswers" | wc -l) fi @@ -98,16 +98,16 @@ calcandshow() { } demander() { - local plotcmd case "$type" in - ( "ouverte" ) pattern=; plotcmd="cat";; - ( "regex" ) pattern="${options:-[ABCD] } "; plotcmd="cat";; + ( "ouverte" ) pattern=; qplotcmd="cat";; + ( "regex" ) pattern="${options:-[ABCD] } "; qplotcmd="cat";; ( * ) possibleanswers="ABCDEFGHIJQLMNOPQRSTUVWXYZ" [ -n "$options" ] && nbq=$(( $(echo "$options" | grep -o '~' | wc -l) + 1 )) echo "$possibleanswers" | grep -o '.' | head -n"$nbq" > "$tmpd/o" answers=$(< "$tmpd/o" tr -d '\n') - pattern="[$answers]$choix ";; + pattern="[$answers]$choix " + qplotcmd="$plotcmd";; esac pattern="GET /$id/$pattern" @@ -117,10 +117,10 @@ demander() { tail -fn0 "$logs" | grep --line-buffered -E "$pattern" > "$tmpd/notif" & # PARSAGE DE LOG tail2pid=$! - calcandshow "$plotcmd" "$hide" + calcandshow "$qplotcmd" "$hide" cat "$tmpd/notif" | while read newanswer ;do uniqueanswers=$(< "$tmpd/in" sort $uopt -k1,1) - [ "$olduniqueanswers" != "$uniqueanswers" ] && calcandshow "$plotcmd" "$hide" + [ "$olduniqueanswers" != "$uniqueanswers" ] && calcandshow "$qplotcmd" "$hide" olduniqueanswers="$uniqueanswers" done & disppid=$! @@ -130,7 +130,7 @@ demander() { if [ -n "$hide" ];then uniqueanswers=$(< "$tmpd/in" sort $uopt -k1,1) - calcandshow "$plotcmd" + calcandshow "$qplotcmd" read _ < /dev/tty uniqueanswers=;groupedanswers=;tot=0 fi