[X-Post & F'up2 de.comp.os.unix.shell]
Thomas Wildgruber wrote:
> Jetzt habe ich gelesen, dass man den Internal Field Seperator (IFS) zB auf
> ein Nemwline-Ziechen (\n) setzen könnte
Richtig.
> aber das scheint nur in Skripts oder Shellfunktionen zu funktionieren:
Natürlich, es ist eine *Shell*variable.
> ---snip---
> $ foldersize ()
>> {
>> IFS=$'\n'
>> for i in `ls`; do
>> du -hs $i
>> done
>> }
> ---snap---
>
> Diese Funktion liefert dann die erwartete Ausgabe:
> […]
> ---snap---
>
> Jetzt habe ich aber das a) das Problem, dass zumindest in dieser Shell
> hinterher meine Umgebungsvariable IFS nicht mehr stimmt, was noch zu
> verschmerzen wäre (weil nur für diese Shell gültig)
Du kannst den Wert von IFS sichern und wiederherstellen:
IFS_bak=$IFS
IFS=$neuer_Wert
# tu was
IFS=$IFS_bak
> und b) ich es jetzt nicht hinbekommen habe das Setzen der
> Umgebungsvariable in meinem Quick and Dirty Einzeiler Workaround zu
> integrieren.
>
> Ein Setzen der Umgebungsvariable in einem Einzeiler scheitert:
>
> ---snip---
> $ IFS=$'\n' for i in `ls`; do du -hs "$i"; done
> -bash: syntax error near unexpected token `do'
> ---snap---
`for' ist kein Befehl und hat daher kein eigenes Environment. Deshalb
funktioniert das so nicht. Siehe Abschnitt SHELL GRAMMAR/Simple Commands in
bash(1).
Dein Ansatz ist aber bereits fchsal. Command Substitution (`…` bzw. $(…)`
konvertiert alle Whitespaces in der Ausgabe des Befehls zu Leerzeichen
(ibid.)
> Kann man jetzt in dieser for-Schleife die Leerzeichen irgendwie geschickt
> maskieren, so dass das Kommando als Einzeiler ausgeführt werden kann oder
> brauche ich die umständliche Variante mit Shell-Skript oder -Funktion?
Du brauchst ls(1) hier nicht, die Shell kann Dateinamen selbstständig
expandieren:
for i in *
do
du -hs "$i"
done
Jedoch kann auch du(1) einiges:
du -hs *
Die Shell expandiert den `*' zu den Namen der Dateien im aktuellen
Verzeichnis (je nach Shell-Optionen auch die versteckten) und übergibt du(1)
das Ergebnis. Dieser Ansatz führt nur dann zu Problemen, wenn die
Befehlszeile dadurch sehr lang wird (die Länge ist begrenzt).
Abhilfe schafft z. B. xargs(1), hier mit GNU find(1):
find . -maxdepth 1 -print0 | xargs -0r du -h
Die Summe müsstest Du dann aber selbst berechnen, z. B. mit awk(1).
--
PointedEars
Twitter: @PointedEars2
Please do not Cc: me. / Bitte keine Kopien per E-Mail.