2009-02-06 14 views
5

W moim skrypcie basha muszę zmienić bieżący katalog na katalog domowy użytkownika.Zmień katalog skryptów na homedir użytkownika w skrypcie powłoki

jeśli chcę zmienić na użytkownika foo domu dir, z wiersza poleceń można zrobić:

cd ~foo 

Które działa dobrze, jednak kiedy zrobić to samo z skryptu mówi mi :

./bar.sh: line 4: cd: ~foo: No such file or directory 

Szwy jak to byłoby takie trywialne, ale to nie działa. Jaki jest problem? Czy muszę uciec od "~" lub być może brakujących cytatów lub czegoś innego?

Edit

kiedy mówię użytkownik nie mam na myśli aktualny użytkownika, który uruchamia skrypt, ale w ogóle żadnego inne użytkownik w systemie

Edit

Oto skrypt:

#!/bin/bash 

user="foo" 
cd ~$user 

jeśli nazwa użytkownika jest sztywno jak

cd ~foo 

to działa, ale jeśli jest w zmiennej użytkownika będzie to nie. Czego tu mi brakuje?

+0

Czy chcesz mieć katalog domowy dla użytkownika foo, czy katalog foo w katalogu domowym użytkownika? –

+0

Chcę katalogu domowego użytkownika foo –

+0

Jak wygląda twój shebang? –

Odpowiedz

15

Co

cd $(getent passwd foo | cut -d: -f6) 

i

USER=foo 
eval cd ~$USER 

prace, zbyt (foo jest nazwą użytkownika)

+0

Dzięki! Obydwie metody zadziałały. _eval_ zrobił dla mnie sztuczkę. –

+0

pierwszy (może nawet z backtickami zamiast $()) jest bardziej przenośny, ponieważ nie każda powłoka obsługuje cd ~ USER. –

8

go zmienić na:

cd $HOME 

Właściwie nie jestem pewien dlaczego cd ~whatever nie będzie działać. Mam tylko przetestowane z małego skryptu i to działało w porządku:

#!/bin/bash 

cd ~sbright 

I rzeczywiście dostać ten sam błąd, co robisz, gdy określony użytkownik nie istnieje w systemie. Czy jesteś pewien (i tak, wiem, że jest to jedno z tych pytań, które są podpięte), że użytkownik istnieje i ma określony katalog domowy?

Edit:

Teraz, gdy widzę, co się faktycznie robi ... tyldy dzieje przed interpolacją zmiennej, dlatego otrzymujesz ten błąd.

+0

Kiedy mam na myśli _user_, nie mam na myśli bieżącego użytkownika, który uruchamia skrypt, ale innego użytkownika w systemie –

+0

Czy mógłbyś opublikować więcej swojego scenariusza? –

+0

Tak, istnieje użytkownik, wiem, że po prostu dlatego, że dokładnie to samo działa z linii poleceń –

-1

Czy jest jakiś powód, dla którego nie można zrobić:

#!/bin/bash 

cd /home/$USER 

katalogów oczywiście nie są w katalogu/home na wszystkich * nixów, ale zakładając, że wiesz, co OS/distro skrypt jest przeznaczony dla, ty powinno być w stanie wymyślić coś, co działa dobrze.

+0

Dzięki za szybką odpowiedź, ale ten/home/$ USER po prostu nie będzie działał z powodu naszej konfiguracji. Używanie "~" w moim środowisku jest jedynym możliwym sposobem sprawdzenia domu użytkownika. –

+0

Ogólnie rzecz biorąc, podczas gdy/home jest zwykłą ścieżką do katalogów domowych, nie jest to gwarantowane. Wydaje mi się/u/home i/home/user [1-9]/i inne ustalenia. – dmckee

0

Czy skrypt będzie uruchamiany przez użytkownika? Jeśli możesz, wystarczy: cd ~

+0

Nie, nie, skrypt jest uruchamiany przez użytkownika root i wykonuje operacje na _other_ users. –

+0

Bash musi interpretować tyldę i zmienną w sposób, jakiego nie oczekujemy. Po odrobinie śladów i błędów działa to: USER = ~ foo; cd $ USER; –

Powiązane problemy