# bash-skripting: USE-flags sortieren

## Christian99

hallo, ich hab mir heut meine make.conf angeschaut, und da stehn massenweise USE-flags drin. normalerweis verwende ich euse dafür, also stehn die alle in der Reihenfolge, wie sie mit euse (de)aktiviert worden sind.

hab mir überlegt, die alphabetisch zu sortieren (bash-skript), klappt auch schon so wie es soll. aber momentan geb ich alles wie es sein soll mit echo aus. wie krieg ich das jetzt am besten so in die "make.conf" rein??

hier das skript:

```
#!/bin/bash

shopt -s nocasematch

source /etc/make.conf

SORT_USE=$( echo $USE | tr ' ' '\n' | sort -f )

#echo $SORT_USE

echo "USE=\""

for k in "" -; do

        for i in $( echo {a..z} ); do

                echo -ne "\t"

                for j in $SORT_USE; do

                        if [[ $j =~ ^[$k][$i][:alnum:]* ]]; then

                                echo -n "$j"

                                echo -n " "

                        fi

                done

                echo "\\"

        done

done

echo "\""

```

das "source /etc/make.conf" gefällt mir auch net so recht. gibts da was besseres die USE-Variable (und nur die) rauszuholen?

und so die ausgabe wie sie sein soll und in die make.conf soll:

```
USE="

        a52 aac aalib acpi adns aim allegro alsa amr apache2 apm \

        bash-completion branding \

        cairo caps cdda cddb cdio cdparanoia cdr consolekit crypt cups curl custom-cflags custom-optimization cxx \

        dbus dga dhcpcd djvu dri dv dvb dvd dvdr dvdread \

        encode encoding examples exif expat \

        fbcondecor ffmpeg fftw flac fontconfig \

        gcj gd geoip gif gimp glade glib gmp gnutls gpg gphoto2 graphviz gstreamer \

        handbook \

        icu id3tag ieee1394 imagemagick imlib inotify \

        java java6 javascript jbig joystick jpeg jpeg2k \

        kde kvm \

        lame latex lcms ldap libcaca libnotify libsamplerate lm_sensors lua lzma lzo \

        mad matroska md5sum midi mikmod mmap mmx mmxext mng modplug mono mozilla mp3 mpeg mplayer mtp musepack mysql mysqli \

        networkmanager nfs nls nsplugin \

        objc ogg openal opencl openexr opengl \

        pcntl pdf phonon php plasma png posix pulseaudio \

        qt qt3 qt3support qt4 quicktime \

        raw \

        sasl scanner sdl smp sndfile speex spell sql sqlite sse sse2 ssse3 startup-notification subversion svg svn \

        taglib theora threads tiff truetype \

        udev unicode usb \

        v4l v4l2 vcd vhosts vnc vorbis \

        wmf wxwindows \

        X x264 xcb xcomposite xml xosd xpm xprint xscreensaver xulrunner xv xvid \

        \

        zip \

        -arts \

        -berkdb \

        -cjk \

        \

        \

        \

        -gcl -gnome -gtk -gtk2 \

        -hal \

        \

        -jabber \

        \

        \

        \

        \

        -oss \

        -pm-utils -policykit \

        \

        \

        -semantic-desktop -static \

        \

        -urandom \

        \

        \

        -xine \

        \

        -zeroconf \

"
```

Schon mal danke für Vorschläge/Hinweise/tipps!

PS: ja, ich weiß man kann auch mit euse die variablen abfragen, aber das ist mir erst eingefallen, als ich das obige schon hatte, und jetzt würds mich zumindest interessieren, wie man das am besten macht.

PS

----------

## SinoTech

 *Christian99 wrote:*   

> 
> 
> [...]
> 
> hab mir überlegt, die alphabetisch zu sortieren (bash-skript), klappt auch schon so wie es soll. aber momentan geb ich alles wie es sein soll mit echo aus. wie krieg ich das jetzt am besten so in die "make.conf" rein??
> ...

 

Schreib dein "USE=..." in eine separate Datei und benutze diese dann in der make.conf

 */etc/make.use wrote:*   

> 
> 
> USE="aigl aiglx alsa \
> 
>         bzip2 \
> ...

 

 */etc/make.conf wrote:*   

> 
> 
> [...]
> 
> source /etc/make.use
> ...

 

 *Christian99 wrote:*   

> 
> 
> [...]
> 
> das "source /etc/make.conf" gefällt mir auch net so recht. gibts da was besseres die USE-Variable (und nur die) rauszuholen?
> ...

 

Nein. Der Inahlt der USE-Variablen kann auf einer Zeile stehen oder in mehrere Zeilen aufgeteilt werden (und selbst da gibt es verschiedene Möglichkeiten). Es ist der einfachste und schönste Weg das ganze von der Shell parsen zu lassen.

Cheers,

Sino

----------

## 69719

Schnelllösung

```

echo $(echo -n 'USE="' && for FLAG in $(source /etc/make.conf && echo $USE); do echo $FLAG; done | sort -u | while read FLAG; do echo -n $FLAG" "; done) > /tmp/make.conf && grep -v 'USE=' /etc/make.conf | grep '=' >> /tmp/make.conf && mv /tmp/make.conf /etc/make.conf.new

```

----------

## Christian99

Danke für eure tipps, das mit dem source /etc/make.use hört sich glaub ich am einfachsten an.

escor:

wenn ich das richtig verstehe, schreibst du die make.conf einfach neu. Die USE-flags sind so zwar sortiert, aber dafür verschwinden Leerzeilen, Kommmentare/sonstige Ordnung aus der make.conf. ist nicht so ganz das was ich möchte.

----------

## Qubit

Hi

```

#!/bin/bash

MAKE_CONF="/etc/make.conf"

SORTED_USE_FLAGS=`grep '^USE' "$MAKE_CONF"|cut -d "\"" -f2|tr -s " " "\n"|sort|tr -s "\n" " "`

USE_FLAGS="USE=\"$SORTED_USE_FLAGS\""

sed -i "s/^USE.*$/${USE_FLAGS}/g" "$MAKE_CONF"

```

Bitte vorher die 'make.conf' sichern!

Gruß Daniel

----------

## 69719

 *Qubit wrote:*   

> Hi
> 
> ```
> 
> #!/bin/bash
> ...

 

Das funktioniert leider nicht wenn USE mehrzeilig ist!

----------

## 69719

 *Christian99 wrote:*   

> Danke für eure tipps, das mit dem source /etc/make.use hört sich glaub ich am einfachsten an.
> 
> escor:
> 
> wenn ich das richtig verstehe, schreibst du die make.conf einfach neu. Die USE-flags sind so zwar sortiert, aber dafür verschwinden Leerzeilen, Kommmentare/sonstige Ordnung aus der make.conf. ist nicht so ganz das was ich möchte.

 

Jepp is richtig.

Wenn du alles erhalten haben willst, wie es ist, dann nutz einfach ufed und speicher es ab. Ufed sortiert autoamtisch die USE Flags beim speichern.

----------

## Hollowman

Hi

Benutze einfach ufed anstatt euse. Dann sind sie immer sortiert.

Sebastian

----------

## Massimo B.

app-portage/flaggie hilft bereits beim Sortieren der /etc/portage/* files. Das könnte auch den Job zum Sortieren der make.conf USE flags übernehmen. flaggie funktioniert aber für mich in vielen Dingen irgendwie nicht, und ich weiß nicht, ob es noch gefplegt wird.

Danke für den Tip mit ufed, kannte ich noch nicht.

Schade, dass es so viele Tools um Portage herum gibt. Zumindest die etablierten Tools sollten irgendwann "offiziell" werden, das heisst in den Gentoo Documents erwähnt werden.

Eine andere Idee zur Sortierung von make.conf USE flags wäre, dass euse diese gleich sortiert. Ich pflege die flags bereits lange mit euse. Dieses bricht die Variable auch korrekt um, macht aber bisher noch keine Sortierung.

----------

## mv

 *Christian99 wrote:*   

> das "source /etc/make.conf" gefällt mir auch net so recht. gibts da was besseres die USE-Variable (und nur die) rauszuholen?

 

Die langsame Möglichkeit:

```
USE=`portageq envvar USE`
```

Die schnelle Möglichkeit:

```
USE=`eix --print USE`
```

In beiden Fällen gehen aufgrund des `` Newlines am Ende verloren (was für Dich wohl nicht wichtig ist). Das lässt sich auf bekannte Art umschiffen, am Einfachsten mit

```
. eix-functions.sh

ReadVar USE USE
```

----------

## musv

Da es vielleicht untergegangen ist:

 *Hollowman wrote:*   

> Benutze einfach ufed anstatt euse. Dann sind sie immer sortiert.

 

----------

## Genone

 *mv wrote:*   

>  *Christian99 wrote:*   das "source /etc/make.conf" gefällt mir auch net so recht. gibts da was besseres die USE-Variable (und nur die) rauszuholen? 
> 
> Die langsame Möglichkeit:
> 
> ```
> ...

 

Weiss nicht wie eix das handhabt, aber die portageq Lösung liefert den fertig ausgewerteten Wert von $USE, der in diesem Fall wohl nicht gewünscht ist (keine Negation, inkl. Standardwerte und USE_EXPAND).

----------

## mv

 *Genone wrote:*   

> die portageq Lösung liefert den fertig ausgewerteten Wert von $USE, der in diesem Fall wohl nicht gewünscht ist (keine Negation, inkl. Standardwerte und USE_EXPAND).

 

Das hatte ich nicht erwartet. Dann geht nur die eix-Lösung sauber: eix --print gibt nur den in Config-Files (oder Environment) definierten Variablenwert aus.

eix ist auf jeden Fall Shell-sourcing vorzuziehen: Nicht nur, weil es schneller ist, sondern auch, weil es Sicherheitsprobleme vermeidet und auch mit Syntax klar kommt, die in make.conf zulässig ist, an der die Shell aber scheitert (bsp. Leerzeichen um "=", spezielle Escapes usw)

----------

