Hallo, On Thu, 20 Mar 2003, Jan Trippler wrote:
On Don, 20 Mär 2003 at 13:38 (+0100), Dieter Kluenter wrote: [...]
Dein Windows Problem kenne ich zwar, kann dir aber keinen Rat geben. Das Problem liegt darin, daß Windows Programme als Zeilenende oder -umbruch
setzen, also Linefeed und Carriage Return, das kann aber ein Unixeditor nicht richtig übersetzen. cat datei | tr -d '\r' >datei.neu && mv datei.neu datei
Useless use of cat! Und das von dir...
Und ja: diesmal muss das cat vorneweg laufen, tr liest nur stdin ;-)
Wie kommst du auf diese duenne Brett? tr -d '\r' < datei > datei.neu $ strace -f -eexecve,fork -s 2 sh -c "cat /tmp/rpmlist | tr -d '\n' >/dev/null" execve("/bin/sh", ["sh", "-c", "cat /tmp/rpmlist | tr -d \'\\n\' >/dev/null"], [/* 89 vars */]) = 0 fork() = 1032 [pid 1032] execve("/bin/cat", ["c"..., ...], [/* 87 vars */]) = 0 [pid 1031] fork() = 1033 [pid 1033] execve("/usr/bin/tr", ["t"..., ...], [/* 87 vars */]) = 0 --- SIGCHLD (Child exited) --- $ strace -f -eexecve,fork -s 2 sh -c "tr -d '\n' /dev/null" execve("/bin/sh", ["sh", "-c", "tr -d \'\\n\' /dev/null"], [/* 89 vars */]) = 0 fork() = 1038 [pid 1038] execve("/usr/bin/tr", ["t"..., ...], [/* 87 vars */]) = 0 --- SIGCHLD (Child exited) --- Erklaerung: tr liest von stdin. Ja. Aber ob die Daten nun via Pipe oder via Eingabeumleitung da landen ist tr herzlich egal und tr hat auch keine Moeglichkeit das zu unterscheiden. Die shell muss im Falle der Pipe stdout von cat auf stdin von tr biegen, ansonsten schlicht stdin von tr mit der Eingabedatei verbinden. Les dir mal die Ausgaben von: strace -f -e'!signal' sh -c "cat Datei | tr -d '\n' >/dev/null" und strace -f -e'!signal' sh -c "tr -d '\n' < Datei >/dev/null" durch... Interessant wird's jew. um das erste 'fork()'. Bei der Umleitung z.B.: ==== schnipp ==== fork() = 1140 [pid 1140] open("/tmp/rpmlist", O_RDONLY|O_LARGEFILE) = 3 [pid 1140] dup2(3, 0) = 0 [pid 1140] close(3) = 0 [pid 1140] open("/dev/null", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3 [pid 1140] dup2(3, 1) = 1 [pid 1140] close(3) = 0 [pid 1140] execve("/usr/bin/tr", ["tr", "-d", "\\n"], [/* 87 vars */]) = 0 ==== schnapp ==== So macht die shell also das Umbiegen der Dateideskriptoren '< /tmp/rpmlist' bzw. '> /dev/null' _bevor_ tr dann ausgefuehrt wird. Mit der Pipe ist's a weng komplexer ;) -dn'*scnr*'h -- 164: Informatiker -- Informatiker sind Geisteswissenschaftler und keine Naturwissenschaftler! Deshalb haben Informatiker zwar den "Rang" eines Ingenieures, sind aber eigentlich keine. IMHO können sie den "Titel" aber auf Antrag bekommen. (Christine Lohr)