$ PWD vs. pwd hinsichtlich der Portabilität

8

Ich schreibe ein Shell-Skript, das den Pfad des aktuellen Arbeitsverzeichnisses analysiert (ein Like aller Basisnamen oberhalb des aktuellen Verzeichnisses).

Bisher habe ich die Umgebungsvariable PWD verwendet, um den Pfad zu analysieren, aber ich frage mich, ob

  • Ich kann darauf zählen, dass PWD immer gesetzt ist
  • um auf jeder Plattform das gleiche Ergebnis zu erzielen

Wäre es möglicherweise besser, die pwd shell-builtin zu verwenden? Ich brauche dieses Skript, um auf so vielen Plattformen wie möglich zu laufen, also habe ich mich nur gefragt ...

    
helpermethod 29.05.2012, 07:46
quelle

4 Antworten

13

POSIX erfordert, dass $PWD auf folgende Weise gesetzt wird:

%Vor%      

Diese Variable soll einen absoluten Pfadnamen des aktuellen Arbeitsverzeichnisses darstellen. Es darf keine Punkte oder Punkte enthalten. Der Wert wird durch das Dienstprogramm cd und durch das Dienstprogramm sh während der Initialisierung festgelegt.

Sie können sich also darauf verlassen, dass das gesetzt wird - aber notieren Sie "... einen absoluten Pfad ...", nicht den absoluten Pfad.

bash (zumindest die letzten Versionen) werden sich daran erinnern, welche symbolischen Links Sie beim Festlegen von $PWD (und% pwd builtin) befolgt haben. command pwd (dh der externe Befehl) wird nicht. So erhalten Sie dort unterschiedliche Ergebnisse, die für Sie wichtig sein könnten oder auch nicht. Verwenden Sie pwd -P , wenn Sie einen Pfad ohne Symlinks wünschen.

Beachten Sie, dass in der pwd -Dokumentation Folgendes steht:

  

Wenn eine Anwendung den Wert von PWD setzt oder nicht setzt, ist das Verhalten von pwd nicht spezifiziert.

Also, tu das nicht:)

Kurz gesagt, hier gibt es keinen Gewinner. Die Umgebungsvariable wird in POSIX-Shells vorhanden sein, ebenso wie der externe Befehl und möglicherweise auch eine eingebaute Variable. Wählen Sie diejenige aus, die am besten zu Ihnen passt, wobei es wichtig ist, ob Sie sich für symbolische Links interessieren oder nicht.

    
Mat 29.05.2012, 07:58
quelle
2

Aus diesem Artikel im Forum "$ PWD vs 'pwd'" , der AIX 4.2.1, AIX vergleicht 6, Sparc Solaris 10 und Redhat 5 Enterprise in dieser Hinsicht:

  • Es gibt keinen Unterschied zwischen $ PWD und eingebautem Pwd,

  • Es gibt keinen Unterschied zwischen eingebautem pwd -P und / usr / bin / pwd.

Ersteres zeigt das Arbeitsverzeichnis mit den Namen der symbolischen Links, während letzteres den tatsächlichen Pfad anzeigt.

Die einzige Diskrepanz besteht darin, dass sich der externe Befehl in den meisten Systemen in / usr / bin und in Redhat / bin befindet.

    
mouviciel 29.05.2012 07:58
quelle
1

Wenn Sie wissen, dass bash verfügbar ist und das Skript damit ausgeführt wird, ist PWD sicher.

Wenn auf einigen Systemen nur einfaches sh verfügbar ist, verwenden Sie pwd .

    
Karoly Horvath 29.05.2012 07:56
quelle
0

Wenn ich es wäre, würde ich pwd verwenden, da es sowohl für bash als auch für sh integriert ist. Das bedeutet nicht, dass sie in jeder Hinsicht identisch funktionieren, aber wenn Sie sie ohne Optionen aufrufen, sollte das keine Rolle spielen.

    
quelle

Tags und Links