/etc/env.d/HORROR

Tomasz Wittner twittner w o2.pl
Pon, 8 Sie 2005, 17:43:25 CEST


On Mon 8. of August 2005 11:35, Andrzej Krzysztofowicz wrote:
> Tomasz Wittner wrote:
> > 2. /etc/env.d/Plik
> > Plik musi mieć taką nazwę jak zmienna i zawierać tylko jedną zmienną - 
> > edytowanie czegoś takiego jest skrajnie niewygodne - w Debianie Sarge 
> > (ówcześnie jeszcze testing) tak był konfigurowany pure-ftpd - horror - ani 
> > wygodne to do przeglądania ani do edycji (to jest tylko wygodne dla 
> > developera przy robieniu pakietu np:
> 
> Jesli chcesz zaproponowac inne rozwiazanie niezalezne od powloki i nie
Rozwiązania niezależnego od powłoki z definicji nie ma - to co się tyczy *csh
jest chyba w /etc/csh.{cshrc,login} reszta korzysta z /etc/profile. O tcsh
powinny zatroszczyć się osoby używającego tego (o ile takie w ogóle istnieją).
Btw: póki co w /etc/csh.login jest używana jakaś akrobatyka z grep & cut
(pewnie prędzej i dużo łatwiej można zrobić to awk), są jakieś dziwne umask.

> wymagajace odpalenia zadnej dodatkowej binarki, to droga otwarta.
/bin/(m)awk i (niestety) /bin/mktemp jest potrzebny w moim rozwiązaniu:
/etc/profile:
[...]
# Export shell variables defined in files placed in /etc/env.d/.
#
# Valid format:
# NAME="value"
#
# Only one assigment per line is allowed - e.g.
# NAME="value"
# FOO="bar"
# Leading blanks (spaces and vertical
# tabs) are skipped. Valid and invalid comments by example:
#
# # this="valid" comment
#    # this another valid comment
# NAME="value" # this is invalid comment
#
# use temprorary file to avoid errors caused by qoutations like this:
# CDRW='dev=ATA:1,1,0 driveropts=burnfree -eject -v -dao -data gracetime=0'
# with:
# $(cat $i | awk '{gsub(/^[ \t]/,""); if(!/^$/) if(!sub(/^#/,"")) print "export " $0}')

j=$(mktemp /tmp/profile.XXXXXX)
# error when mktemp failed or file is not empty or file is not regular file
if [ "$?" != "0" -o -s "$j" -o ! -f "$j" ] ; then
    echo "Error during /etc/profile execution: can't create temprorary file."
    echo "Skipping setting variables from /etc/env.d ."
else
    for i in /etc/env.d/* ; do
        NAME=`basename $i`
        case $NAME in
            *~ | *.bak | *.old | *.rpmnew | *.rpmsave )
                # nothing
                ;;
            * )
                if [ -r $i ]; then
                    # eat all blanks from line beginning, skip empty lines, detect comment, export rest of $0
                    cat $i | awk '{gsub(/^[ \t]/,""); if(!/^$/) if(!sub(/^#/,"")) print "export " $0}' >> $j
                fi
                ;;
        esac
    done
    . $j
    rm -f $j
fi
unset j
[...]

Co do mktemp - czy można zastąpić to (jako fallback z elif) czymś z sh w stylu:
j=/tmp/${RANDOM}${RANDOM}${RANDOM} ; :>$j
ew. ktoś zna jakieś lepsze, gotowe rozwiązania w sh?
Jeżeli komuś udałoby się wyeliminować kłopoty z cytowaniem, wtedy nie istniałaby
konieczność używania pliku tymczasowego. Oto jak wygląda błąd:
/etc/env.d/CDRW:
CDRW='dev=ATA:1,1,0 driveropts=burnfree -eject -v -dao -data gracetime=0'

$ $(cat /etc/env.d/CDRW | awk '{gsub(/^[ \t]/,""); if(!/^$/) if(!sub(/^#/,"")) print "export " $0}')
-bash: export: `-eject': not a valid identifier
-bash: export: `-v': not a valid identifier
-bash: export: `-multi': not a valid identifier
-bash: export: `-dao': not a valid identifier
-bash: export: `-data': not a valid identifier
$ echo $CDRW
'dev=ATA:1,1,0
$

> 
> > for X in CCACHE_DIR CCACHE_TEMPDIR CCACHE_LOGFILE CCACHE_PATH CCACHE_CC \ 		
> > CCACHE_PREFIX CCACHE_DISABLE CCACHE_READONLY CCACHE_CPP2 CCACHE_NOSTATS \ 
> > CCACHE_NLEVELS CCACHE_HARDLINK CCACHE_RECACHE CCACHE_UMASK CCACHE_HASHDIR \ 
> > CCACHE_UNIFY CCACHE_EXTENSION
> > do
> >         echo "#${X}=\"\"" > $RPM_BUILD_ROOT/etc/env.d/${X}
> > done
> > 
> > Miłego edytowania nastu plików (zamiast jednego).
> 
> SOD#1
U siebie mam wszystkie exportowane zmienne per prog. w jednym pliku - kłopot, żeby
było to akceptowalne i mogło być użyte standardowo w pakietach.

-- 
Tomasz Wittner



Więcej informacji o liście dyskusyjnej pld-devel-pl