In bash, se si esegue questa operazione:C'è un modo semplice per impostare nullglob per un glob
mkdir /tmp/empty
array=(/tmp/empty/*)
si scopre che array
ha ora un elemento, "/tmp/empty/*"
, non zero come vuoi. Per fortuna, questo può essere evitato attivando l'opzione di shell nullglob utilizzando shopt -s nullglob
Ma nullglob è globale, e quando si modifica uno script di shell esistente, può rompere le cose (per esempio, qualcuno ha controllare il codice di uscita di ls foo*
per verificare se ci sono i file che iniziano con "pippo"?). Quindi, idealmente, mi piacerebbe accenderlo solo per un piccolo ambito - idealmente, un'espansione del nome file. È possibile spegnerlo nuovamente usando shopt -u nullglob
Ma, naturalmente, solo se è stato disattivato prima:
old_nullglob=$(shopt -p | grep 'nullglob$')
shopt -s nullglob
array=(/tmp/empty/*)
eval "$old_nullglob"
unset -v old_nullglob
mi fa pensare ci deve essere un modo migliore. L'ovvio "metterlo in una subshell" non funziona, ovviamente l'assegnazione della variabile muore con la subshell. Altro che waiting for the Austin group per importare la sintassi di ksh93, c'è?
Questo è abbastanza buono. Fallirà se i nomi dei file contengono delle nuove righe, ma sebbene ciò sia consentito, è piuttosto raro. Finché i nomi dei file non sono sotto il controllo di un aggressore. – derobert
Sì, esistono nuove righe nei nomi dei file. Normalmente, ciò dovrebbe significare solo "trovare il colpevole e punirlo/lei". A parte il fatto che l'unica volta che ho visto newline nei nomi dei file, il colpevole era un'affascinante signora anziana ... – mivk