2008-09-15 6 views
1

Ich möchte eine Datei verwenden, um die aktuelle Versionsnummer für eine Kundensoftware zu speichern, die von einem Start-Skript verwendet werden kann, um die Binärdatei im richtigen Verzeichnis auszuführen.Was ist der beste Weg, um eine Versionszeichenfolge aus einer Datei zu extrahieren?

Zum Beispiel, wenn das Arbeitsverzeichnis wie folgt aussieht:

. 
.. 
1.2.1 
1.2.2 
1.3.0 
run.sh 
current_version 

Und current_version enthält:

1.2.2 

I run.sh in 1.2.2 absteigen wollen, und starten Sie das Programm foo.

Die aktuelle Lösung ist dies:

#!/bin/sh 
version = `cat current_version` 
cd $version 
./foo 

Es funktioniert, ist aber nicht sehr robust. Es prüft nicht auf Datei Existenz, kann nicht mit mehreren Zeilen, führende Leerzeichen, kommentierte Zeilen, leere Dateien, etc. umgehen.

Was ist die überlebensfähigste Möglichkeit, dies entweder mit einer Shell oder Perl-Skript zu tun?

Antwort

5

Das ist ein gemeinsamer Ansatz. Sie können mit test-Operatoren wie "if [-d" somedirectory "; dann" oder [-t "somefile"]

nach dir/file existence suchen. Allerdings verwende ich symbolische Links häufiger. Dann können Sie einfach Ihren symbolischen Link ändern, um die gewünschte Version zu verwenden.

Zum Beispiel

 
$ ln -s 1.2.2 current_version 
$ ls -al 
total 20 
drwxr-xr-x 5 dbreese dbreese 4096 2008-09-15 13:34 . 
drwxr-xr-x 3 dbreese dbreese 4096 2008-09-15 13:34 .. 
drwxr-xr-x 2 dbreese dbreese 4096 2008-09-15 13:34 1.2.1 
drwxr-xr-x 2 dbreese dbreese 4096 2008-09-15 13:34 1.2.2 
drwxr-xr-x 2 dbreese dbreese 4096 2008-09-15 13:34 1.3.0 
lrwxrwxrwx 1 dbreese dbreese 6 2008-09-15 13:34 current_version -> 1.2.2/ 

Dann können Sie Ihr Skript nur "cd current_version" verwenden.

+0

Ich möchte Links zu vermeiden, weil Ich möchte bestehende Instanzen des Programms nicht stören, die das Ändern ihres Arbeitsverzeichnisses ablehnen könnten. – Frosty

0

Ich würde das Skript ändern, um ein Argument zu akzeptieren. Das Argument sollte ein Dateiname sein. Öffnen Sie die Datei mit der von Ihnen bevorzugten Skriptsprache [perl, python] und durchlaufen Sie die Datei, bis Sie eine Übereinstimmung für Ihre Version gefunden haben.

Ich würde eine Regex verwenden ... etwas in der Art von /\d\.\d\.\d/. Dann lassen Sie die Anwendung über Ihr Skript ausführen.

+0

Eine gute Lösung, aber es gibt keine Garantie, dass die Version x.x.x. bleiben Die Minor-Zahlen könnten über 9 hinausgehen und etwas wie 1.2.12 ergeben, was fehlschlagen würde. – Frosty

+0

@Frosty Vielleicht wäre /\d+\.\d+\.\d+/ in diesem Fall dienen? –

0

Sie können mit den & & und || auf Existenz prüfen Operatoren:

 
!$/bin/sh 
version = `cat current_version` 
cd $version && ./foo || echo "Bad version" 

Der & & Bediener die zweite Anweisung bewirkt, dass nur auszuführen, wenn die erste (Exit-Status 0) erfolgreich ist, und der || Der Operator bewirkt, dass die zweite Anweisung nur ausgeführt wird, wenn die erste fehlschlägt (Exit-Status ungleich Null).

Ich bin nicht sicher, was Sie meinen, indem Sie mit mehreren Zeilen, führenden Leerzeichen oder kommentierten Zeilen umgehen.

+0

Ich würde gerne leicht "falsche" Versionsdateien behandeln. Wenn die Datei zwei Zeilen hat, ein führendes Leerzeichen, ein nachstehendes Leerzeichen oder etwas ähnliches, würde die ursprüngliche Lösung fehlschlagen. – Frosty

-4
!#/bin/sh 

if [ -e 'current_version' ]; then 
    version=`cat current_version`; 
    version=`echo $version | tr -ds [[:blank:]]` 
    if [ -n "$version" ]; then 
     if [ -d "$version" ]; then 
     cd "$version" 
     else 
     echo $version is not a directory 
     fi 
    else 
     echo version_file contained only blanks 
    fi 
else 
    No file named current_version exists 
fi 
+0

Dies wird fehlschlagen, es sei denn, es gibt ein Verzeichnis namens $ version. '$ version' gibt immer die Zeichenfolge $ version zurück und expandiert niemals die Variable. Verwenden Sie stattdessen doppelte Anführungszeichen: "$ version". –

0

Wenn die Versionierung immer in #. # Ist.# Format, können Sie dies tun:

ls | grep ^[0-9]\.[0-9]\.[0-9]$ | sort -nr | head -n 1 

, die Versionen in absteigender numerischer Reihenfolge auflistet, wählt dann die erste dieser

+0

Keine Garantie für die Versionsnummer. Außerdem möchte ich in der Lage sein, current_version zurückzuspulen, wenn sich herausstellt, dass die neueste Version instabil ist. Vielleicht wäre es am besten, wenn man eine Art Grep mit dem Lösungs-Slipset kombiniert. – Frosty

0

Was:

#!/usr/bin/perl -w 
use strict; 
use warnings; 

my $version_file = 'current_version'; 
open my $fh, '<', $version_file or die "Can't open $version_file: $!"; 

# Read version from file 
my $version = <$fh>; 
chomp $version; 

# Remove whitespace (and match version) 
die "Version format not recognized" if $version !~ m/(\d+\.\d+\.\d+)/; 

my $dir = $1; 
die "Directory not found: $dir" unless -d $dir; 

# Execute program in versioned directory. 
chdir $dir; 
system("./foo"); 
Verwandte Themen