Quando la shell sta analizzando una linea, tokenizzerà la linea in parole, eseguirà varie espansioni (in ordine) sulle parole, quindi eseguirà il comando.
supporre test=1:2:3:4:5:6
Diamo un'occhiata a questo comando: IFS=":" read a b c d e f <<< "$test"
Dopo la tokenizzazione, si verifica l' espansione dei parametri :IFS=":" read a b c d e f <<< "1:2:3:4:5:6"
La shell imposterà la variabile IFS per la durata del comando read e readsaprà applicare $ IFS al suo input e dare valori ai nomi delle variabili.
Questo comando ha una storia simile, ma risultati diversi: HOME="hello" echo "$HOME"
Poiché l'espansione dei parametri avviene prima dell'inizio del comando, la shell ha:
HOME="hello" echo "/home/username"
E poi, durante l'esecuzione del comando echo, il nuovo valore di $ HOME non viene utilizzato affatto.
Per ottenere ciò che stai cercando di fare, scegline uno
# Delay expansion of the variable until its new value is set
HOME="hello" eval 'echo "$HOME"'
o
# Using a subshell, so the altered env variable does not affect the parent.
# The semicolon means that the variable assignment will occur before
# the variable expansion
(HOME="hello"; echo "$HOME")
ma non scegliere il primo.
local.