2013-09-24 8 views
7

Ich habe ein seltsames Problem bei der Arbeit mit Bash-Skriptsprache. Hier ist es:Bash Skript Peinlichkeit mit Pwd

PWD=${pwd} 
# several commands 
cd /etc/nginx/sites-enabled/ 
# more commands 
cd $PWD 
# I expect that I returning to my directory, 
# but $PWD contains current dir - /etc/nginx/sites-enabled/ 

Diese behaiveour ist ein eine Art faul - $ PWD speichert Befehl, das aktuelle Verzeichnis berechnet und gibt es in dem Moment wo wir $ PWD nennen. Aber ich möchte String-Variable darin speichern. Wie geht das?

Antwort

21

PWD ist eine Umgebungsvariable und wird geändert, wenn Sie das Verzeichnis ändern.

Verwenden Sie einen anderen Namen für die Variable,

zB:

MYPWD=${PWD} #or MYPWD=$(pwd) 
cd /etc/nginx/sites-enabled/ 
cd $MYPWD 
+0

Lass es einfach hier als Dokumentationsfrage sein. Etwa eine halbe Stunde, um dieses Problem zu lösen. –

+3

Es ist eine gute Idee, Kleinbuchstaben (oder Groß-/Kleinbuchstaben) für Ihre Variablen zu verwenden, um Konflikte wie diese zu vermeiden ... –

2

Versuchen:

PWD=`pwd` 

Oder:

PWD=$(pwd) 

Beide Ausdrücke werden führen Sie den PWD Befehl und speichern Sie die Befehlsausgabe in der Shell-Variablen PWD. Es gibt viele Diskussionen im Internet darüber, wann jeder Stil verwendet werden soll. Der einzige Punkt, an den ich mich erinnere, ist, dass der "$ (cmd)" - Ansatz das Verschachteln von Befehlen ermöglicht, z.

CURRENT_BASENAME=$(basename $(pwd)) 

Bearbeiten - Es kam nur zu mir, dass PWD ein in Shell-Variablen aufgebaut ist, die immer auf dem aktuellen Arbeitsverzeichnis erweitert.

+1

Nr wurde ich schlecht konzentriert und erwähnte nicht, dass $ PWD - eine Systemvariable ist und zeigt immer auf aktuellen Verzeichnis . 'HPWD = $ (pwd)' hat gut funktioniert. –