Qualche differenza tra ~ e $ HOME?

7

Sembrerebbe che ~ e $ HOME siano equivalenti nella riga di comando e negli script di shell. È vero?

    
posta tomcam 01.10.2016 - 02:54
fonte

2 risposte

10

È vero fino a un certo punto.

  • $HOME è un'espressione per l'espansione della variabile d'ambiente HOME
  • ~ (tilde) è un componente di espansione della shell separato vedi nota

Se usato come argomento di comando e in separazione da altre stringhe, $HOME e ~ sono generalmente equivalenti.

Ma ci sono casi in cui differiscono:

  • se la stringa che contiene è quotata, ad esempio:

    # echo "My home directory is $HOME"
    My home directory is /Users/techraf
    # echo "My home directory is ~"
    My home directory is ~
    
  • se sono concatenati a una stringa, ad esempio:

    • dd if=${HOME}/source_file of=${HOME}/destination_file funzionerà.

      Shell passerà gli argomenti if=/Users/techraf/source_file e of=/Users/techraf/destination_file contenenti un percorso valido al comando dd .

    • dd if=~/source_file of=~/destination_file non funzionerà

      Shell passerà gli argomenti if=~/source_file e of=~/destination_file al comando dd e segnalerà un errore poiché non interpreta ~ .

nota:

In effetti ~ è sostituito per impostazione predefinita con il valore di HOME , ma se HOME è vuoto, viene risolto in una directory home:

# echo $HOME
/Users/techraf
# export HOME=/dummy
# echo $HOME
/dummy
# echo ~
/dummy

# unset HOME
# echo $HOME

# echo ~
/Users/techraf

Da man bash :

Tilde Expansion

If a word begins with an unquoted tilde character ('~'), all of the characters preceding the first unquoted slash (or all characters, if there is no unquoted slash) are considered a tilde-prefix. If none of the characters in the tilde-prefix are quoted, the characters in the tilde-prefix following the tilde are treated as a possible login name. If this login name is the null string, the tilde is replaced with the value of the shell parameter HOME.

If HOME is unset, the home directory of the user executing the shell is substituted instead. Otherwise, the tilde-prefix is replaced with the home directory associated with the specified login name.

    
risposta data 01.10.2016 - 03:02
fonte
0

$HOME è disponibile nelle fasi iniziali di accesso quando ~ non è disponibile. Il motivo è che $HOME è definito dall'ambiente di sistema e ~ è una scorciatoia da shell. Ecco perché $HOME è preferito per lo scripting di shell.

    
risposta data 01.10.2016 - 03:03
fonte

Leggi altre domande sui tag