2009-02-06 3 views
5

Nel mio script bash ho bisogno di cambiare la directory corrente nella home directory dell'utente.Cambiare la directory di script in homedir dell'utente in uno script di shell

se voglio cambiare per foo home directory dell'utente, dalla riga di comando che posso fare:

cd ~foo 

che funziona bene, ma quando lo faccio lo stesso dal sceneggiatura mi dice :

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

Cuciture come se fosse una cosa così banale, ma non funziona. Qual è il problema qui? Devo sfuggire il "~" o forse le virgolette mancanti o qualcos'altro?

Modifica

quando dico utente non intendo dell'utente corrente che esegue lo script, ma in generale qualsiasi altra utente del sistema

Modifica

Ecco la sceneggiatura:

#!/bin/bash 

user="foo" 
cd ~$user 

se il nome utente è codificato come

cd ~foo 

funziona, ma se è in variabile utente quindi non è così. Cosa mi manca qui?

+0

Vuoi la directory home per l'utente foo, o la directory foo nella home directory dell'utente? –

+0

Voglio home directory dell'utente foo –

+0

Che aspetto ha il tuo Shebang? –

risposta

15

Che dire

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

e

USER=foo 
eval cd ~$USER 

opere, troppo (foo è il nome utente)

+0

Grazie! Entrambi i metodi hanno funzionato. _eval_ ha fatto il trucco per me. –

+0

il primo (forse anche con i backtick invece di $()) è più portabile dato che non tutte le shell supportano cd ~ USER. –

8

modificarla in:

cd $HOME 

In realtà, io non sono sicuro perché cd ~whatever non avrebbe funzionato. Ho appena testato con un piccolo script e ha funzionato bene:

#!/bin/bash 

cd ~sbright 

Io in realtà lo stesso messaggio di errore che si fa quando l'utente specificato non esiste nel sistema. Sei sicuro (e sì, so che questa è una di quelle domande inserite) che l'utente esiste e ha una directory home valida specificata?

Edit:

Ora che vedo quello che si sta effettivamente facendo ... espansione della tilde accade prima dell'interpolazione variabile, che è il motivo per cui si stanno ottenendo questo errore.

+0

Quando intendo _user_ non intendo l'utente corrente che esegue lo script, ma qualsiasi altro utente sul sistema –

+0

Potresti pubblicare più script? –

+0

Sì, l'utente esiste, so che semplicemente perché la stessa cosa esatta funziona dalla riga di comando –

-1

c'è qualche ragione per cui non si può fare:

#!/bin/bash 

cd /home/$USER 

di directory del corso non sono in/home su tutti i sistemi * nix, ma a patto di saper che cosa OS/distro lo script è destinato l'è dovrebbe essere in grado di trovare qualcosa che funzioni abbastanza bene.

+0

Grazie per la risposta rapida ma questo/home/$ USER semplicemente non funzionerà a causa della nostra configurazione. L'utilizzo di "~" nel mio ambiente è l'unico modo fattibile per cercare la casa dell'utente. –

+0

Più in generale, mentre/home è il solito percorso delle home directory, non è garantito. Ho sembrato/u/home e/home/utente [1-9]/e altri arrangiamenti. – dmckee

0

è lo script sta per essere eseguito da parte dell'utente? Se lo si può semplicemente fare: cd ~

+0

No no, lo script viene eseguito dall'utente root e sta eseguendo operazioni su altri utenti. –

+0

Bash deve interpretare la tilde e la variabile in un modo che non ci aspettiamo. Dopo un pò di scia e errore funziona: USER = ~ foo; cd $ USER; –