From ba969e3788c198a440f2474c9f2e981bbb9dce4d Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Wed, 6 Apr 2016 14:24:53 +0400 Subject: [PATCH] =?UTF-8?q?ajout=20de=20stdredir=20pour=20pallier=20l'abse?= =?UTF-8?q?nce=20=C3=A9ventuelle=20de=20/dev/std*?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ulib/awk | 4 ++-- lib/ulib/base | 47 +++++++++++++++++++++++++++++++++++++++++++++++ utrigger | 8 ++------ 3 files changed, 51 insertions(+), 8 deletions(-) diff --git a/lib/ulib/awk b/lib/ulib/awk index d224539..8684a64 100644 --- a/lib/ulib/awk +++ b/lib/ulib/awk @@ -1731,7 +1731,7 @@ parse_headers && do_once("parse-headers") { # résultat [ -n "$output" ] || output=/dev/stdout - <"$tmpsorted" >"$output" awkrun -f \ + stdredir "$tmpsorted" "$output" "" awkrun -f \ padlen:int="$padlen" \ headerscsv="$headers" show_headers:int="$show_headers" \ ' @@ -1916,7 +1916,7 @@ function lprintcsv() { [ -n "$output" ] || output=/dev/stdout values=("$@") - awkrun -f >>"$output" fields[@] show_headers:int="$show_headers" values[@] ' + stdredir "" ">>$output" "" awkrun -f fields[@] show_headers:int="$show_headers" values[@] ' BEGIN { if (show_headers) array_printcsv(fields) if (fields_count > 0) count = fields_count diff --git a/lib/ulib/base b/lib/ulib/base index f7aeef3..2e2571f 100644 --- a/lib/ulib/base +++ b/lib/ulib/base @@ -2742,6 +2742,53 @@ function utools_local() { done } +function stdredir() { + # Lancer la commande $4..@ en redirigeant stdin depuis $1, stdout vers $2, + # stderr vers $3. Si $1 est vide ou vaut /dev/stdin, la redirection n'est + # pas faite. Si $2 est vide ou vaut /dev/stdout, la redirection n'est pas + # faite. Si $3 est vide ou vaut /dev/stderr, la redirection n'est pas faite. + # Cette fonction existe parce que sur certaines versions de bash, il semble + # que les redirections /dev/std* ne sont pas traitées de façon particulière. + # De plus, sur des technologies telles que OpenVZ, les chemins /dev/std* ne + # sont pas créés (parce que /proc/self/fd/* n'est pas accessible). Donc, + # dans de rares cas où le script tourne sur OpenVZ avec une version de bash + # qui est buggée, la redirection n'est pas faite correctement. + local __redirs __in __out __err + if [ -n "$1" -o "$1" == /dev/stdin ]; then + if [ "${1#<}" != "$1" ]; then + __in="${1#<}" + else + __in="$1" + fi + __redirs="$__redirs"' <"$__in"' + fi; shift + if [ -n "$1" -o "$1" == /dev/stdout ]; then + if [ "${1#>>}" != "$1" ]; then + __out="${1#>>}" + __redirs="$__redirs"' >>"$__out"' + elif [ "${1#>}" != "$1" ]; then + __out="${1#>}" + __redirs="$__redirs"' >"$__out"' + else + __out="$1" + __redirs="$__redirs"' >"$__out"' + fi + fi; shift + if [ -n "$1" -o "$1" == /dev/stderr ]; then + if [ "${1#>>}" != "$1" ]; then + __err="${1#>>}" + __redirs="$__redirs"' 2>>"$__err"' + elif [ "${1#>}" != "$1" ]; then + __err="${1#>}" + __redirs="$__redirs"' 2>"$__err"' + else + __err="$1" + __redirs="$__redirs"' 2>"$__err"' + fi + fi; shift + eval '"$@"'"$__redirs" +} + function isatty() { # tester si STDOUT n'est pas une redirection tty -s <&1 diff --git a/utrigger b/utrigger index 6b83fad..490cf60 100755 --- a/utrigger +++ b/utrigger @@ -147,12 +147,8 @@ uspid="$base.uspid" function __update_pending() { touch "$podata" [ "$datafile" == "-" ] && datafile=/dev/stdin - if [ -n "$datafile" ]; then - cat "$datafile" >>"$podata" - fi - if [ -n "$data" ]; then - echo "$data" >>"$podata" - fi + [ -n "$datafile" ] && stdredir "$datafile" ">>$podata" "" cat + [ -n "$data" ] && echo "$data" >>"$podata" } function __run_command() { (