|
|
newer setzt einen exit-Code, der angibt, ob eine bestimmte Datei neuer als eine andere ist. Die Aufgabe geht auf Kernighan und Pike zurück, aber das Problem ist verblüffend schwierig zu lösen.
ls -t gibt seine Argumente zeitlich sortiert aus. Folglich könnte eine Lösung so aussehen:
1 #!/bin/sh
2 PATH=/usr/ucb:/bin:/usr/bin
3 set -f
4
5 if [ $# != 2 ]
6 then echo >&2 "usage: `basename $0` newfile oldfile"
7 exit 1
8 fi
9
10 ls -dt "$@" |
11 { read new && [ X"$new" = X"$1" ] && exit 0
12 exit 1
13 }
Leider funktioniert diese Lösung nicht, wenn eine der Argument-Dateien nicht existiert:
$ newer0 . a; echo $?; newer0 a .; echo $? a not found 0 a not found 1
Man muß offenbar zuerst den exit-Code von ls auswerten:
1 #!/bin/sh
2 # PATH=/usr/ucb:/bin:/usr/bin
3 set -f
4
5 if [ $# != 2 ]
6 then echo >&2 "usage: `basename $0` newfile oldfile"
7 exit 1
8 fi
9
10 if ls -dt "$@" > /dev/null
11 then ls -dt "$@" |
12 { read new && [ X"$new" = X"$1" ] && exit 0
13 exit 1
14 }
15 else exit 1
16 fi
Ohne eigenen PATH wird GNU-ls verwendet und die Lösung funktioniert. Setzt man PATH, stellt sich heraus, daß NeXT-ls den exit-Code 0 auch dann liefert, wenn ein Argument nicht existiert.
$ PATH=/bin sh -c './newer2 a .; echo $?; ./newer2 . a; echo $?' a not found a not found 1 a not found a not found 0
Vielleicht sollte man versuchen, find -newer zu verwenden:
1 #!/bin/sh 2 PATH=/usr/ucb:/bin:/usr/bin 3 set -f 4 5 if [ $# != 2 ] 6 then echo >&2 "usage: `basename $0` newfile oldfile" 7 exit 1 8 fi 9 10 test X"`find "$1" -newer "$2" -print | sed 1q`" = X"$1"
Alle bisherigen Lösungen funktionieren außerdem nicht besonders gut, wenn ein Dateiname mit einem Minuszeichen anfängt oder gar einen Zeilentrenner enthält.
1 #!/bin/sh 2 PATH=/usr/ucb:/bin:/usr/bin 3 set -f 4 5 if [ $# != 2 ] 6 then echo >&2 "usage: `basename $0` newfile oldfile" 7 exit 1 8 fi 9 10 test X"`ls -dt -- "$@"; echo .`" = X"$1 11 $2 12 ."
Der Aufruf von echo verhindet zwar, daß abschließende Zeilentrenner aus der Ausgabe von ls entfernt werden können, aber wenn Dateinamen nur aus Zeilentrennern bestehen, gibt es noch immer Probleme. Außerdem ist das Resultat auch dann wahr, wenn beide Dateien exakt gleich alt sind...
|
|
Last modified 03/July/97