Bestätigen Das aktuelle Arbeitsverzeichnis basiert auf der Inode-Nummer und nicht auf dem, wonach Sie gesucht haben, um dorthin zu gelangen. Da Sie bash verwenden, können Sie $ PWD wie folgt verwenden, um in das neue Verzeichnis mit dem gleichen Namen zu wechseln:
cd $ PWD
Zur Veranschaulichung habe ich einen Dummy-Bereitstellungsbefehl erstellt:
set -x
cd ~/tmp
rm -rf code
mkdir code
echo echo hello from $* > code/run
chmod +x code/run
Hat die erste Bereitstellung erstellt, eine CD zum Codieren erstellt und dann den Inhalt mit überprüft, ls -lai
damit Sie die Inodes sehen können:
ianh@abe:~/tmp$ ./,deploy first
++ cd /home/ianh/tmp
++ rm -rf code
++ mkdir code
++ echo echo hello from first
++ chmod +x code/run
ianh@abe:~/tmp$ cd code
ianh@abe:~/tmp/code$ ls -lai
total 12
22945913 drwxr-xr-x 2 ianh ianh 4096 Apr 9 23:12 .
22937618 drwxrwxr-x 14 ianh ianh 4096 Apr 9 23:12 ..
22939455 -rwxr-xr-x 1 ianh ianh 22 Apr 9 23:12 run
Führen Sie nun die zweite Bereitstellung aus
ianh@abe:~/tmp/code$ ../,deploy 2nd
++ cd /home/ianh/tmp
++ rm -rf code
++ mkdir code
++ echo echo hello from 2nd
++ chmod +x code/run
Und überprüfe den Inhalt des Verzeichnisses ... jetzt ist nichts mehr im Verzeichnis! nicht mal '.' und '..'! Daran können Sie erkennen, dass die Bash den Verzeichniseintrag cd ..
'..' nicht verwendet, wenn Sie sie ausführen, da '..' nicht mehr vorhanden ist - ich nehme an, dass dies Teil der $ PWD-Behandlung ist. Einige andere / ältere Shells funktionieren nichtcd ..
in dieser Situation , Sie müssen zuerst einen absoluten Pfad angeben.
ianh@abe:~/tmp/code$ ls -lai
total 0
CD an $PWD
und versuchen Sie es erneut:
ianh@abe:~/tmp/code$ cd $PWD
ianh@abe:~/tmp/code$ ls -lai
total 12
22945914 drwxr-xr-x 2 ianh ianh 4096 Apr 9 23:12 .
22937618 drwxrwxr-x 14 ianh ianh 4096 Apr 9 23:12 ..
22939455 -rwxr-xr-x 1 ianh ianh 20 Apr 9 23:12 run
ianh@abe:~/tmp/code$ ./run
hello from 2nd
Beachten Sie, wie sich der Inode für das aktuelle Verzeichnis (.) Geändert hat.
Wenn Ihr Bereitstellungsskript das alte Verzeichnis in einen anderen Namen verschieben würde, z. B. mv code code.$$
im obigen Bereitstellungsskript, ./run
würde dies funktionieren, aber bis Sie es verwenden cd $PWD
, würden Sie den alten Code ausführen, nicht den neuen.
ianh@abe:~/tmp/code$ ./run
hello from 2nd
ianh@abe:~/tmp/code$ ../,deploy 3rd
++ cd /home/ianh/tmp
++ '[' -d code ']'
++ mv code code.9629
++ mkdir code
++ echo echo hello from 3rd
++ chmod +x code/run
ianh@abe:~/tmp/code$ ./run
hello from 2nd
ianh@abe:~/tmp/code$ cd $PWD
ianh@abe:~/tmp/code$ ./run
hello from 3rd
Die Bereitstellung mit capistrano hat das gleiche Problem (sie haben einen Symlink vom aktuellen Namen zur aktuellen Version), daher verwende ich Aliase, um zu den Produktions- / Staging-Bereichen zu wechseln und RAIL_ENV entsprechend einzustellen:
alias cdp='export RAILS_ENV=production; echo RAILS_ENV=$RAILS_ENV ; cd /var/www/www.example.com/current'
alias cds='export RAILS_ENV=staging; echo RAILS_ENV=$RAILS_ENV ; cd /var/www/staging.example.com/current'