2012-07-20 13 views
45

Avevo sempre pensato che $HOME e ~ fossero esattamente gli stessi e quindi potesse essere usato in modo intercambiabile. Oggi, quando ho provato a installare pylibmc, un python vincolante per memcached, sul mio server condiviso l'uso di ~ mi ha dato errore ma non $HOME. Mi piacerebbe capire perché.

libmemcached è un requisito per pylibmc. Ho libmemconnected installato nella mia directory home perché non ho root sul server. Di conseguenza, per installa pylibmc, ho bisogno di assicurarmi che lo script di installazione sappia dove trovare trovare libmemconnected.

Quando si esegue python setup.py install --with-libmemcached=~, lo script di installazione corre

 
gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall \ 
    -Wstrict-prototypes -fPIC -DUSE_ZLIB -I~/include \ 
    -I/usr/local/include/python2.7 -c _pylibmcmodule.c \ 
    -o build/temp.linux-i686-2.7/_pylibmcmodule.o -fno-strict-aliasing 

che dà gli errori che libmemcached non può essere trovato.

Se cambio al --with-libmemcached=$HOME, lo script viene eseguito

 
gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall \ 
    -Wstrict-prototypes -fPIC -DUSE_ZLIB -I/home/waterbotte/include \ 
    -I/usr/local/include/python2.7 -c _pylibmcmodule.c \ 
    -o build/temp.linux-i686-2.7/_pylibmcmodule.o -fno-strict-aliasing 

senza alcun problema. Sembra che il problema sia che la tilde non viene risolta. Ma perché?

+5

Ritengo che la tilde sia una comodità da linea di comando. Negli script, invece, deve essere sempre usato $ HOME. –

risposta

27

La shell sostituisce ~ con la directory home dell'utente (aggiornamento: o forse per la home directory di un altro utente, se ~ è seguita da qualcosa di diverso da un /), ma solo se è il primo carattere di una parola.

--with-libmemcached=~ non ha ~ non all'inizio, quindi il guscio lo lascia da solo.

+2

Stromberg @ aw50 ~ $ echo abc ~ def abc ~ def Stromberg @ aw50 ~ $ echo ~ def ~ def Stromberg @ aw50 ~ $ echo def ~ def ~ Stromberg @ aw50 ~ $ echo abc $ {HOME} DEF abc/home/strombergdef Stromberg @ aw50 ~ $ echo $ {HOME} def /home/strombergdef Stromberg @ aw50 ~ $ echo def $ {HOME} def/home/Stromberg Stromberg @ aw50 ~ $ – user1277476

+0

@ user1277476: questo è molto difficile da leggere. Si prega di consultare l'aggiornamento. –

+0

Fatto interessante da imparare. Esattamente quello che sto cercando. Grazie – tamakisquare

33

La tilde fa parte di un shell expansion (come in bash, csh, zsh, ecc.). La variabile $HOME è esportabile e può essere utilizzata indipendentemente da una shell specifica.

8

La differenza principale è:

cd /tmp 
ls "$HOME" #works 
ls "~" #nope 

Quindi, guscio di espandere la ~ solo in poche situazioni. Nel tuo caso, lo script python è diventato semplice all'interno dello script, non il valore expaded.

15

~ si espande solo se è il primo carattere di una parola ed è non quotate

$ echo "~" 
~ 
$ echo foo~ 
foo~ 
$ echo ~ 
/home/guest 
$ echo ~/foo 
/home/guest/foo 

~username si espande al HOME del username.

$ echo ~root 
/root 
$ echo ~invaliduser 
~invaliduser 

Per citare i nomi dei file, è necessario utilizzare $HOME o citare il suffisso

$ echo "$HOME/foo bar" 
/home/guest/foo bar 
$ echo ~/"foo bar" 
/home/guest/foo bar 
$ echo ~root/"foo bar" 
/root/foo bar 

Nota quanto segue dal "POSIX Tilde Expansion"

Il percorso risultante dalla espansione della tilde, sono trattati come se citato per impedire che venga alterato dalla divisione del campo e dall'espansione del percorso.