Potwierdzanie Bieżący katalog roboczy jest oparty na numerze i-węzła, a nie na tym, czego szukałeś, aby się tam dostać. Ponieważ używasz bash, możesz użyć $ PWD w następujący sposób, aby cd do nowego katalogu o tej samej nazwie:
cd $ PWD
Aby to zilustrować, podjąłem atrapę polecenia wdrażania:
set -x
cd ~/tmp
rm -rf code
mkdir code
echo echo hello from $* > code/run
chmod +x code/run
Utworzono pierwsze wdrożenie, cd'd do kodowania, a następnie sprawdzono zawartość za pomocą, ls -lai
aby zobaczyć i-węzły:
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
Teraz uruchom drugie wdrożenie
ianh@abe:~/tmp/code$ ../,deploy 2nd
++ cd /home/ianh/tmp
++ rm -rf code
++ mkdir code
++ echo echo hello from 2nd
++ chmod +x code/run
I sprawdź zawartość katalogu ... teraz nic nie ma w katalogu! nawet nie '.' i '..'! Z tego widać, że bash nie używa wpisu katalogu „..”, gdy działasz, cd ..
ponieważ „..” już nie istnieje - przypuszczam, że jest to część jego obsługi $ PWD. Niektóre inne / starsze powłoki nie radzą sobie cd ..
w tej sytuacji, musisz najpierw cd do absolutnej ścieżki.
ianh@abe:~/tmp/code$ ls -lai
total 0
Cd do $PWD
i spróbuj ponownie:
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
Zauważ, jak zmienił się i-węzeł dla bieżącego katalogu (.)?
Jeśli skrypt wdrażania przeniósł stary katalog na inną nazwę, np. mv code code.$$
W powyższym skrypcie wdrażania, ./run
działałby, ale dopóki go nie użyjesz cd $PWD
, uruchomisz stary kod, a nie nowy.
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
Wdrażanie przy użyciu capistrano ma ten sam problem (mają one dowiązanie symboliczne od nazwy bieżącej do bieżącej wersji), więc używam aliasów, aby cd do obszarów produkcji / inscenizacji, a także odpowiednio ustawić RAIL_ENV:
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'