Perché "cat {foo}" non emette foo, ma "cat {foo, bar}" lo fa?


12

Stavo cercando di concatenare i file di testo in sottocartelle e ho provato:

cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1}/book.txt > out$var

Tuttavia, questo non ha restituito nulla. Quindi, ho provato ad aggiungere una 'sottocartella2' non esistente

cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1,subfolder2}/book.txt > out$var

E questa volta ha funzionato, concatenando i file con successo. Perché succede?


2
Usa echoinvece di catper vedere quale riga di comando hai. (O utilizzare set -xper il debug.)
Peter Cordes,

Risposte:


22

Per definizione, l'espansione del controvento in GNU Bash richiede un'espressione di sequenza o una serie di valori separati da virgola:

I pattern da ampliare assumono la forma di un preambolo opzionale, seguito da una serie di stringhe separate da virgola o da un'espressione di sequenza tra una coppia di parentesi graffe, seguita da un poscritto opzionale.

Puoi leggere il manuale per i dettagli.

Alcuni semplici esempi:

echo {subfolder1}
{subfolder1}

echo {subfolder1,subfolder2}
subfolder1 subfolder2

echo subfolder{1}
subfolder{1}

echo subfolder{1..2}
subfolder1 subfolder2


1

Le parentesi graffe si espandono solo se hanno stringhe separate da coma, ad esempio {abc, def} o intervallo, ad esempio {a..e} specificato tra loro.

Nel tuo caso puoi semplicemente scrivere una sottocartella1 senza racchiuderla tra parentesi graffe in quanto non è necessario

cat ./{mainfolder1,mainfolder2,mainfolder3}/subfolder1/book.txt > out$var

Sfortunatamente, si /path/{a,}/filenameespande alle due stringhe /path/a/filenamee /path//filename, che può essere indesiderato.
Kusalananda

grazie @Kusalananda per avermi rettificato, sì bash fornirà un avviso dicendo "ambiguo reindirizzamento"
Neo_Returns

No, si ottiene ambiguous redirect se si tenta di reindirizzare in un file fornito da una variabile non quotata che non ha alcun valore, ad es echo 'hello' >$idontexist.
Kusalananda

1
... o se il nome file nel reindirizzamento viene espanso in più parole. Come > *.txtcon più .txtfile o > $filese $filecontiene spazi bianchi. Ma ovviamente non c'è nulla di ambiguo nel dare catpiù argomenti
ilkkachu,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.