Bug in coreutils?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Bug in coreutils?

Beitrag von linuxCowboy » 28.02.2013 23:18:22

Geht:

Code: Alles auswählen

find `e $PATH|tr ':' ' '` \( -type f -o -type l \) -links +1 -ls|sort -k4,4 -k1|uniq -w7 --all-repeated=separate
Geht nicht:

Code: Alles auswählen

find `e $PATH|tr ':' ' '` \( -type f -o -type l \) -links +1 -ls|sort -k4,4 -k1|uniq -w7 --all-repeated separate
find `e $PATH|tr ':' ' '` \( -type f -o -type l \) -links +1 -ls|sort -k4,4 -k1|uniq -w7 -D separate
find `e $PATH|tr ':' ' '` \( -type f -o -type l \) -links +1 -ls|sort -k4,4 -k1|uniq -w7 -Dseparate
uniq --version:
uniq (GNU coreutils) 8.5 # squeeze
uniq (GNU coreutils) 8.13 # wheezy

Habe ich wirklich in den genialen coreutils, die Millionen nutzen, meinen eigenen Bug gefunden?
-der_linux_cowboy --- Besser werden! ... f*** w$$

dufty
Beiträge: 378
Registriert: 21.09.2012 21:09:05

Re: Bug in coreutils?

Beitrag von dufty » 28.02.2013 23:40:36

Wenn ich mir die man-page anschaue,
-D, --all-repeated[=delimit-method] print all duplicate lines
sind Deine 3 "Geht nicht"-Beispiele syntaktisch nicht erlaubt. (und somit ist es auch kein Fehler,
wenn es nicht geht.)
Oder kennst Du Gegenbeispiele?
Danke.

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Bug in coreutils?

Beitrag von Cae » 28.02.2013 23:56:42

uniq(1) hat geschrieben:

Code: Alles auswählen

       -D, --all-repeated[=delimit-method]
              print              all              duplicate              lines
              delimit-method={none(default),prepend,separate}  Delimiting   is
              done with blank lines
Also ich interpretiere das so: -D oder --all-repeated ist gleichbedeutend mit --all-repeated=none. -D geht nicht mit = und/oder delimit-method (ist beides in der eckigen Klammer hinten), daher sind deine letzten beiden Beispiele nicht konform. Allerdings haben wir genau hier eine Inkonsistenz: -f 2 funktioniert genau nach diesem Schema, ist aber nicht explizit ausgezeichnet. Auf der anderen Seite ist bei -f das Argument nicht optional, damit laesst es sich eindeutig von einer nachgestellten Datei ./2 unterscheiden.

Bug? Inkonsistent, ja. Und 'ne Doku, bei der man zwei Mal nachdenken muss. Aber nicht komplett kaputt im Sinne von unerwartetem Fehlverhalten. Das da ist dokumentiertes unerwartetes Fehlverhalten. ;)

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Benutzeravatar
Natureshadow
Beiträge: 2157
Registriert: 11.08.2007 22:45:28
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Radevormwald
Kontaktdaten:

Re: AW: Bug in coreutils?

Beitrag von Natureshadow » 01.03.2013 00:02:14

Vielleicht benutzt du einfach which -a. Falls ich den Zweck deines Wahnsinnskonstruktes da richtig interpretiert habe...

dufty
Beiträge: 378
Registriert: 21.09.2012 21:09:05

Re: Bug in coreutils?

Beitrag von dufty » 01.03.2013 00:10:13

Das ist kein "Wahnsinnskonstrukt".
find war schon von jeher ein Befehl mit einer "arcane"-Syntax.
Er hat nur "e" als alias für "echo".
Und "-ls|sort" liest sich "-ls | sort" schöner.
(Ein Leerzeichen vor und hinter ";" erhöht auch die Lesbarkeit, zum Bleistift.)

Benutzeravatar
Natureshadow
Beiträge: 2157
Registriert: 11.08.2007 22:45:28
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Radevormwald
Kontaktdaten:

Re: AW: Bug in coreutils?

Beitrag von Natureshadow » 01.03.2013 00:16:54

Du.. Ich kann lesen :).

dufty
Beiträge: 378
Registriert: 21.09.2012 21:09:05

Re: AW: Bug in coreutils?

Beitrag von dufty » 01.03.2013 00:20:44

Natureshadow hat geschrieben:Du.. Ich kann lesen :).
Was noch lange nicht heisst, das Du alles verstehst ...
;)

Benutzeravatar
r900
Beiträge: 1053
Registriert: 09.10.2011 20:06:11
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Stockholm

Re: Bug in coreutils?

Beitrag von r900 » 01.03.2013 03:01:38

Wie beim TÜV mit dem Blinker.. Aber anstatt geht, geht nicht wäre die Ausgabe interessant. Vor der pipe nach uniq und danach in beiden Fällen.

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Bug in coreutils?

Beitrag von linuxCowboy » 01.03.2013 07:28:19

Ja ihr habt recht, ist keine mandatory option!

Es heißt nur:
"Mandatory arguments to long options are mandatory for short options too."

Ist aber keine Eigenart von uniq, sondern ein Feature von getopt. Die lange Option gibt einfach die kurze zurück mit optarg = NULL.

Es ist aber genauso vorgesehen, mit zwei :: ein optional argument als solches zu kennzeichnen!

in uniq.c getopt_long(,,".. D ==> D:: ..",,)

dann geht --all-repeated=separate und -Dseparate.

Ein schneller Hack. Früher hätte ich mir bei sowas mit SoftICE Windows zurechtgepatcht. Heute haben wir bei GNU/Linux ja die Source! ;-)

Die Ausgabe kann ich nachreichen:

Code: Alles auswählen

~$ e -e "1\n2\n2"
1
2
2
~$ e -e "1\n2\n2"|uniq
1
2
~$ e -e "1\n2\n2"|uniq -u
1
~$ e -e "1\n2\n2"|uniq -d
2
~$ e -e "1\n2\n2"|uniq -D
2
2
~$ e -e "1\n2\n2"|uniq --all-repeated=separate
2
2
~$ e -e "1\n2\n2"|uniq --all-repeated separate
uniq: separate: No such file or directory

~$ e -e "1\n2\n2"|uniq -Dseparate
uniq: eparate: invalid number of bytes to skip

~$ e -e "1\n2\n2"|uniq -D separate
uniq: separate: No such file or directory
Fix:

Code: Alles auswählen

cd /tmp
ag source coreutils/testing
cd coreutils*
./configure
vi +/12345 src/uniq.c
make
strip src/uniq
cp src/uniq /usr/local/bin
hash uniq
Final:

Code: Alles auswählen

~$ e -e "1\n2\n2"|uniq --all-repeated=separate
2
2
~$ e -e "1\n2\n2"|uniq -Dseparate
2
2

~$ e -e "1\n2\n2"|uniq --all-repeated separate
uniq: separate: No such file or directory

~$ e -e "1\n2\n2"|uniq -D separate
uniq: separate: No such file or directory
-der_linux_cowboy
-der_linux_cowboy --- Besser werden! ... f*** w$$

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Bug in coreutils?

Beitrag von linuxCowboy » 24.10.2015 00:43:10

Jetzt habe ich doch dasselbe Problem zweimal gelöst! :facepalm:

Hardlinks finden. find -type l holt nur softlinks.

Dazu zur besseren Übersicht jeweils eine Leerzeile einfügen.

Code: Alles auswählen

Ffhl ()
{
	[ "$1" = "-h" -o "$1" = "--help" ] &&

	echo "
	$FUNCNAME [path... {$PATH}] # find hardlinks
" && return

	p=${1+$*}

	p=${p:-`echo $PATH | tr : ' '`}

	echo -e "$p\n"

	find $p \( -type f -o -type l \) -links +1 -ls | sort -b -k4,4n -k1,1n -k11 | 
                perl -pE '($i)=$_=~/^(\d+)/; if($j && $i!=$j){say ""}; $j=$i'
}
Ist ja auch schon eine Weile her... aber ich wußte da war was. :wink:
-der_linux_cowboy --- Besser werden! ... f*** w$$

Antworten