GNU/Linux >> Linux Esercitazione >  >> Linux

~ Sempre uguale a $casa?

So che probabilmente è stato chiesto prima, ma non sono riuscito a trovarlo con Google.

Dato

  • Kernel Linux
  • Nessuna configurazione che cambia $HOME
  • bash

~ == $HOME essere vero?

Risposta accettata:

Ciò che è importante capire è che ~ l'espansione è una caratteristica della shell (di alcune shell), non è un personaggio magico che indica la tua home directory ovunque venga utilizzata.

Viene espanso (dalla shell, che è un'applicazione usata per interpretare le righe di comando), come $var viene espanso al suo valore in alcune condizioni quando viene utilizzato in una riga di comando della shell prima dell'esecuzione del comando.

Quella caratteristica è apparsa per la prima volta nella shell C alla fine degli anni '70 (la shell Bourne non la aveva, né il suo predecessore la shell Thompson), è stata successivamente aggiunta alla shell Korn (una shell più recente costruita sulla shell Bourne nel anni 80). Alla fine è stato standardizzato da POSIX ed è ora disponibile nella maggior parte delle conchiglie, comprese quelle non POSIX come fish .

Poiché è così diffuso nelle shell, alcune applicazioni non shell lo riconoscono anche come directory home. È il caso di molte applicazioni nei loro file di configurazione o nei loro propri riga di comando (mutt , slrn , vim …).

bash in particolare (che è la shell del progetto GNU e ampiamente utilizzata in molti sistemi operativi basati su Linux), quando viene invocata come sh , segue principalmente le regole POSIX su ~ espansione, e nelle aree non specificate da POSIX, si comporta principalmente come la shell Korn (di cui è una parte clone).

Mentre $var è espanso nella maggior parte dei punti (tranne all'interno di virgolette singole), ~ espansione, essendo un ripensamento si espande solo in alcune condizioni specifiche.

Viene espanso quando si trova sul proprio argomento in contesti di elenco, in contesti in cui è prevista una stringa.

Ecco alcuni esempi di dove è espanso in bash :

  • cmd arg ~ other arg
  • var=~
  • var=x:~:x (richiesto da POSIX, usato per variabili come PATH , MANPATH …)
  • for i in ~
  • [[ ~ = text ]]
  • [[ text = ~ ]] (l'espansione di ~ preso come modello in AT&T ksh ma non bash dalla 4.0).
  • case ~ in ~) ...
  • ${var#~} (sebbene non in alcune altre shell)
  • cmd foo=~ (sebbene non quando invocato come sh e solo quando cosa c'è a sinistra di = ha la forma di un bash senza virgolette nome variabile)
  • cmd ~/x (richiesto da POSIX ovviamente)
  • cmd ~:x (ma non x:~:x o x-~-x )
  • a[~]=foo; echo "${a[~]} $((a[~]))" (non in alcune altre shell)

Ecco alcuni esempi in cui non è espanso:

  • echo "~" '~'
  • echo [email protected] ~~ (nota anche che ~u ha lo scopo di espandersi nella directory home dell'utente u ).
  • echo @~
  • (( HOME == ~ )) , $(( var + ~ ))
  • con extglob :case $var in @(~|other))... (sebbene case $var in ~|other) va bene).
  • ./configure --prefix=~ (come --prefix non è un nome di variabile valido)
  • cmd "foo"=~ (in bash , a causa delle virgolette).
  • quando invocato come sh :export "foo"=~ , env JAVA_HOME=~ cmd
Correlati:Debian – Misterioso "impossibile risolvere l'host" in dead.letter?

Per quanto riguarda a cosa si espande:~ da solo si espande al contenuto della HOME variabile, o quando non è impostata, nella home directory dell'utente corrente nel database dell'account (come estensione poiché POSIX lascia quel comportamento indefinito).

Va notato che in ksh88 e bash versioni precedenti alla 4.0, l'espansione di tilde è stata sottoposta a globbing (generazione di nomi di file) in contesti di elenco:

$ bash -c 'echo "$HOME"'
/home/***stephane***
$ bash -c 'echo ~'
/home/***stephane*** /home/stephane
$ bash -c 'echo "~"'
~

Questo non dovrebbe essere un problema nei casi normali.

Tieni presente che, poiché è espanso, lo stesso avviso si applica alle altre forme di espansione.

cd ~

Non funziona se $HOME inizia con - o contiene .. componenti. Quindi, anche se è molto improbabile che faccia mai la differenza, a rigor di termini, si dovrebbe scrivere:

cd -P -- ~

O anche:

case ~ in
  (/*) cd -P ~;;
  (*) d=~; cd -P "./$d";;
esac

(per coprire i valori di $HOME come - , +2 …) o semplicemente:

cd

(come cd ti porta alla tua home directory senza alcun argomento)

Altre shell hanno ~ più avanzati espansioni. Ad esempio, in zsh , abbiamo:

  • ~4 , ~- , ~-2 (con completamento) utilizzato per espandere le directory nel tuo stack di directory (le posizioni in cui hai cd a prima).
  • directory denominate dinamiche . Puoi definire il tuo meccanismo per decidere come ~something viene ampliato.

Linux
  1. Perché Windows 10 VM mostra l'utilizzo della CPU al 100% sempre su QEMU-KVM?

  2. Lo scopo di .bashrc e come funziona?

  3. Come fa Bash a sapere come viene invocato?

  4. Cosa significano -s e [[]] in una condizione if in Bash?

  5. Il comando Rm nello script Bash non funziona con la variabile?

Come confrontare le stringhe in Bash

Bash Shebang

Il carattere jolly Bash Star * produce sempre un elenco ordinato (crescente)?

Come funziona cat << EOF in bash?

Cosa fa 'bash -c'?

La corrispondenza del modello non funziona nello script bash