diff --git a/lib/ulib/.ulibver b/lib/ulib/.ulibver index 8f361ea..72528e2 100644 --- a/lib/ulib/.ulibver +++ b/lib/ulib/.ulibver @@ -1 +1 @@ -007013002 +007014000 diff --git a/lib/ulib/base b/lib/ulib/base index 2beffbc..fa71094 100644 --- a/lib/ulib/base +++ b/lib/ulib/base @@ -1304,7 +1304,7 @@ function __la_cmd() { local arg local cmd="/bin/ls -1d" for arg in "$@"; do - arg="$(_rval "$arg")" + arg="$(qwc "$arg")" cmd="$cmd $arg" done cmd="$cmd 2>/dev/null" diff --git a/lib/ulib/base.core b/lib/ulib/base.core index dfcf89e..c4fa045 100644 --- a/lib/ulib/base.core +++ b/lib/ulib/base.core @@ -29,31 +29,6 @@ function recho_() { echo -n "$@" fi } -function _rval() { -# Dans la chaine $*, remplacer \ par \\, " par \", ' par \', ( par \(, ) par \), -# { par \{, } par \}, [ par \[, ] par \], $ par \$, ` par \`, SPACE par \SPACE - -# Cela permet de quoter une chaine à afficher telle quelle, sans guillemets, e.g -# eval "echo $(_rval "$value")" -# Note: la protection de ! n'est pas effectuée, parce que le comportement du -# shell est incohérent entre le shell interactif et les scripts. Pour une -# version plus robuste, il est nécessaire d'utiliser un programme externe tel -# que sed ou awk - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s//\'/\'}" - s="${s//\(/\(}" - s="${s//\)/\)}" - s="${s//\{/\{}" - s="${s//\}/\}}" - s="${s//\[/\[}" - s="${s//\]/\]}" - s="${s//\$/\\\$}" - s="${s//\`/\\\`}" - s="${s// /\\ }" - recho_ "$s" -} function _qval() { # Dans la chaine $*, remplacer \ par \\, " par \", $ par \$, ` par \` # Cela permet de quoter une chaine à mettre entre guillements. @@ -129,6 +104,61 @@ function qvals() { done [ -z "$first" ] && echo } +function qwc() { +# Dans la chaine $*, remplacer \ par \\, " par \", $ par \$, ` par \`, puis +# quoter la chaine avec ", sauf les wildcards * et ? +# Cela permet de quoter une chaine permettant de glober des fichiers, e.g +# eval "ls $(qwc "$value")" +# Note: la protection de ! n'est pas effectuée, parce que le comportement du +# shell est incohérent entre le shell interactif et les scripts. Pour une +# version plus robuste, il est nécessaire d'utiliser un programme externe tel +# que sed ou awk + local s="$*" + s="${s//\\/\\\\}" + s="${s//\"/\\\"}" + s="${s//\$/\\\$}" + s="${s//\`/\\\`}" + local r a b + while [ -n "$s" ]; do + if [[ "$s" == *\** ]]; then + if [[ "$s" == *\?* ]]; then + a="${s%%\**}" + b="${s%%\?*}" + if [ ${#a} -lt ${#b} ]; then + s="${s#*\*}" + r="$r\"$a\"*" + else + s="${s#*\?}" + r="$r\"$b\"?" + fi + else + a="${s%%\**}" + s="${s#*\*}" + r="$r\"$a\"*" + fi + elif [[ "$s" == *\?* ]]; then + if [[ "$s" == *\** ]]; then + a="${s%%\**}" + b="${s%%\?*}" + if [ ${#a} -lt ${#b} ]; then + s="${s#*\*}" + r="$r\"$a\"*" + else + s="${s#*\?}" + r="$r\"$b\"?" + fi + else + a="${s%%\?*}" + s="${s#*\?}" + r="$r\"$a\"?" + fi + else + r="$r\"$s\"" + break + fi + done + recho_ "$r" +} function qlines() { # Traiter chaque ligne de l'entrée standard pour en faire des chaines quotées # avec '