2015-05-12 5 views
10

Dies ist ein Shell-Skript (SH-Datei). Ich muss einen absoluten Pfad basierend auf dem aktuellen Verzeichnis erstellen. Ich weiß über pwd, aber wie verkette ich es mit einer anderen Zeichenfolge? Hier ist ein Beispiel dafür, was ich zu tun versucht:Aktuelles Verzeichnis abrufen und einen Pfad verketten

"$pwd/some/path" 
+1

Was ist Ihre Shell? Einige Shells behalten eine '$ PWD'-Variable, so dass Sie nicht nach' pwd' rufen müssen. –

Antwort

17

klingt wie Sie wollen:

path="$(pwd)/some/path" 

Die $( öffnet sich ein Sub-Shell (und die ) schließt es), wo der Inhalt Wird als Skript ausgeführt, sodass alle Ausgaben an dieser Position in der Zeichenfolge eingefügt werden.


Weitere nützlich oft wird das Verzeichnis des Skripts erhalten, die ausgeführt wird:

dot="$(cd "$(dirname "$0")"; pwd)" 
path="$dot/some/path" 

Die nützlichen ist, weil es ganz gleich, auf den gleichen Pfad löst, wo Sie sind, wenn Sie das Skript ausführen:

> pwd 
~ 
> ./my_project/my_script.sh 
~/my_project/some/path 

statt:

> pwd 
~ 
> ./my_project/my_script.sh 
~/some/path 
> cd my_project 
> pwd 
~/my_project 
> ./my_script.sh 
~/my_project/some/path 

Komplexere aber wenn Sie das Verzeichnis des aktuellen Skript ausgeführt wird, wenn es durch einen Symlink (häufig, wenn Skripte durch homebrew zum Beispiel die Installation) ausgeführt wurde, dann müssen Sie den Symlink analysieren und folgen:

if [[ "$OSTYPE" == *darwin* ]]; then 
    READLINK_CMD='greadlink' 
else 
    READLINK_CMD='readlink' 
fi 

dot="$(cd "$(dirname "$([ -L "$0" ] && $READLINK_CMD -f "$0" || echo "$0")")"; pwd)" 

Komplexere und mehr Anforderungen für die Arbeit (z mit einem Gnu kompatiblen Readlink installiert), so tendiere ich dazu, es nicht so oft zu verwenden. Nur wenn ich sicher bin, dass ich es brauche, wie zum Beispiel einen Befehl über Homebrew zu installieren.

+0

Während '$ (pwd)' funktioniert, ist es einfacher (und marginal effizienter), '$ PWD' zu verwenden, was a ist POSIX-mandatierte Shell-Variable. Ein guter Tipp bestimmt das Verzeichnis _running script's_, aber beachten Sie, dass dies möglicherweise nicht wie erwartet funktioniert, wenn das Skript über _symlink_ aufgerufen wurde. Leider gibt es keine einfache Lösung, die auch tragbar ist. – mklement0

+1

Wahr wahr, Symlinks können es komplexer machen, ich werde es aktualisieren, um das zu zeigen. –

+0

Danke für die Aktualisierung. Da 'readlink -f' den absoluten Zielpfad auch dann anzeigt, wenn das Argument _not_ ein symbolischer Link ist, könnten Sie vereinfachen zu' dot = $ (dirname - "$ (READLINK_CMD -f -" $ 0 ")") ''. Beachten Sie, dass die Verwendung von '$ OSTYPE' nicht portabel ist (' bash' und 'zsh' haben es jedoch). Ich habe eine POSIX-konforme Shell-Funktion [hier] erstellt (http://stackoverflow.com/a/29835459/45375). – mklement0

0
wd=`pwd` 
new_path="$wd/some/path" 
3

Die Shell pwd in einem Befehlssubstitutions gebautet ($(...)) ist eine Option, aber nicht notwendig, weil alle POSIX-kompatiblen shells die spezielle $PWD Shell-Variable zu definieren, die das aktuelle Verzeichnis als absoluter Pfad enthält, wie mandated by POSIX .

So mit $PWD ist einfacher und effizienter als $(pwd):

"$PWD/some/path" # alternatively, for visual clarity: "${PWD}/some/path" 

jedoch wenn Sie Symlinks lösen im Verzeichnispfad wollen, Sie müssen pwd mit seinem -P Option:

"$(pwd -P)/some/path" 

Beachten Sie, dass POSIX mandates that $PWD contain an absolute pathname with symlinks resolved. In der Praxis tut dies jedoch KEINE große POSIX-artige Shell (bash, dash, ksh, zsh), die alle symbolische Verbindungskomponenten behalten. Daher wird pwd -P benötigt, um sie zu lösen.


Michael Allen's helpful answer weist darauf hin, dass ist es üblich, wissen zu wollen, das Verzeichnis, wo der laufende Skript befindet.

Die Herausforderung besteht darin, dass die Skriptdatei selbst sein kann, ein Symlink, so das wahre Verzeichnisses Ursprung Bestimmung ist nicht-triviale, vor allem, wenn Portabilität ist ein Muss.
This answer (von mir) zeigt eine Lösung.

0

mit "dirname $0" können Sie Dynamin Pfad bis zum aktuellen Lauf-Scipt. zum Beispiel: Ihre Datei befindet sich im Shell-Ordner Dateiname ist XYZ und es gibt Anthor-Datei abc in XYZ-Datei enthalten. so in XYZ-Datei einfügen LIke:

 php "`dirname $0`"/abc.php 
Verwandte Themen