Ho appreso che le espansioni dei nomi dei file vengono eseguite prima dell'esecuzione dei comandi quando si eseguono i comandi in Bash. Ma quando si cerca i comandi indicati di seguito (con l'opzione -x):Espansione del nome file negli argomenti "a = b" -like dei comandi incorporati di Bash
touch foo=3 # Create a file with name "foo=3"
+ touch foo=3
declare foo=?
+ declare 'foo=?'
alias foo=*
+ alias 'foo=*'
non ottengo quello che mi aspettavo, perché foo =? e foo = * non sono espanse al nome del file "foo = 3":
declare -p | grep 'foo=' # => foo='?'
alias | grep 'foo=' # => alias foo='*'
Ma se corro un built-in come cd o una funzione che accetta un incarico come parametro scritta da me, come mi viene show_rhs() { echo "${1%=*}='${1#*=}'"; }
cosa mi aspetto (foo =? and foo = * sono espansi).
cd foo=? # => foo=3: Not a directory
show_rhs() foo=* # => foo='3'
L'unica differenza che posso vedere qui è dichiarano e alias sono built-in E accettare un incarico come parametro. Sembra che venga aggiunta una coppia di citazioni per racchiudere il compito prima delle espansioni dei nomi dei file in base all'output dell'opzione -x.
Ma se l'espansione del nome file viene eseguita prima dell'esecuzione del comando indipendentemente da quale sia il comando, l'argomento passato in declare e alias deve essere foo = 3 anziché foo =? e foo = * a causa della presenza del file "foo = 3".
Quindi Bash fa qualcosa di speciale (magari citando i caratteri jolly?) Su argomenti "a = b", a seconda dei comandi prima delle espansioni dei nomi dei file?
(Il mio ambiente: CentOS 5.8 a 64 bit, GNU Bash 3.2.25)
Alias e variabili vivono in diversi spazi dei nomi. Puoi assolutamente avere un alias e una variabile con lo stesso nome.Una variabile creata con un compito semplice e una creata con 'declare' sono la stessa cosa anche se così' foo = 3; declare foo =? 'ti lascia con una variabile' pippo' con il valore '?'. Sei sicuro di ottenere gli errori che rivendichi per queste ultime due righe? Perché non vedo come sia possibile. Nessuno di questi contesti valuterà le variabili (e il secondo non è nemmeno una linea di shell valida e dovrebbe darti un errore su un token imprevisto). –
Ci scusiamo per la confusione. Non volevo dire se fosse possibile creare una variabile e un alias con lo stesso nome. Intendo entrambi foo =? and foo = * dovrebbe essere espanso a foo = 3 a causa della presenza del file "foo = 3" prima di essere passato in quei comandi, quindi sia la variabile che l'alias dovrebbero avere un valore di "3" piuttosto che l'originale jolly. Il codice di dichiarazione e alias sono solo esempi. – ebk
Ah, ok. Ho quasi commentato un file 'foo = 3' ma ho pensato che fosse improbabile (e non l'hai menzionato nel post). Ma sì, penso che la tua ipotesi sia corretta. Il fatto che quei built-in accettino assegnazioni direttamente significa che il normale comportamento di espansione glob non si verifica lì. (Non succede nemmeno per 'foo =?') Probabilmente c'è qualcosa nelle specifiche POSIX su questo. Posso provare a guardare dopo. –