ajout de stdredir pour pallier l'absence éventuelle de /dev/std*

This commit is contained in:
Jephté Clain 2016-04-06 14:24:53 +04:00
parent 472f2c7786
commit ba969e3788
3 changed files with 51 additions and 8 deletions

View File

@ -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

View File

@ -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

View File

@ -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() { (