[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Kommandozeile und aptitude



marc.winkelmann@gmx.net:

>  dpkg -l | grep kde | grep "4\.1\."| awk '{print $2}' \
>  | xargs aptitude --assume-yes remove

>Mein Problem ist, wenn ich das mache, entkoppelt sich die
>Kommandozeile. Sprich, wenn eine Abfrage kommt, z.B. kdm
>stoppen, kann ich nichts mehr auswählen und muss den Prozess
>killen und wieder anwerfen. 

Das Problem ist, dass aptitude als Standardeingabe den Kanal
(wohl das Terminal) braucht, den auch der Kommandointerpreter
verwendet, in dem du das Pipeline dpkg ... | ... | xargs ...
startest, weil du Abfragen interaktiv beantworten willst.  Wie
aber soll xargs das bewerkstelligen?  Xargs verwendet seine
Standardeingabe, um die Wörter zu lesen, die es an die
Parameterliste zu aptitude anhängen soll; darüberhinaus kennt es
keinen offenen Eingabekanal zum Terminal.

Im Manualpage zu xargs in Etch steht, dass xargs dem Programm,
das es startet, als Standardeingabe einen Kanal zu /dev/null
mitgibt (würde es das nicht machen, sondern statt dessen seinen
eigenen Standardeingabekanal weiterreichen, würde aptitude aus
dem Kanal, der für xargs bestimmt ist, Zeichen weglesen) und das
Single Unix Specification Version 3 (bei
http://www.opengroup.org/) sagt, dass das Ergebnis "unspecified"
ist, wenn das zu startende Programm versucht, von seiner
Standardeingabe zu lesen.  Also:  So geht's nicht, aber so:

dpkg -l | grep kde | grep "4\.1\."| awk '{print $2}' \
| xargs -- sh -c 'exec </dev/tty ${1+"$@"}' sh \
aptitude --assume-yes remove

Auf diese Weise startet xargs ein sh. Das sh verwendet die Liste
von Wörtern, die es als positional Parameters erhält, also
»aptitude«, »--assume-yes«, »remove« und die von xargs
angefuegten Wörter, dazu, sie mittels exec als Command zu starten
(siehe im Manualpage sh(1) die Beschreibung zum built-in Befehl
exec), wobei vor dem Start /dev/tty (das Terminal) zur
Standardeingabe des Commands gemacht wird.

Warum ich bei

   sh -c 'exec </dev/tty ${1+"$@"}' sh aptitude ...
                                    ^^

dieses »sh« eingefügt habe, wird klar, wenn du

   sh -c 'echo ${1+"$@"}' sh 1 2 3

und

   sh -c 'echo ${1+"$@"}' 1 2 3

probierst, und im Newsgroup de.comp.os.unix.shell war das auch
schon mehr als einmal Thema.

>Kennt jemand eine Methode, das Obige zu machen und trotzdem die
>Gewalt über die Kommandozeile zu behalten?

Die hast du nie verloren, es geht nur darum, dafür zu sorgen,
dass Programme die Ein- und Ausgabekanäle bekommen, die sie
brauchen.
-- 
Bitte in die Adressierung auch meinen |Please put my full name also into
Vor- u. Nachnamen stellen z.B.        |the recipient like
Friedhelm Waitzmann <xxx@example>, (Friedhelm Waitzmann) xxx@example,
"Waitzmann, Friedhelm" <xxx@example>


Reply to: