Sim, isso está usando o histórico.
!#
é um designador do evento histórico
que se refere a toda a linha de comando digitada até agora.
:*
é um designador de palavra (intervalo) que se refere a todas as palavras, exceto a 0ª.
Então, depois de ter digitado echo "This is a sentence. "
,
então !#:*
expande para "This is a sentence. "
.
E x-y
(onde x e y são inteiros)
é um designador de palavra (intervalo) que se refere ao número da palavra x através do número da palavra y .
Se y for omitido ( x-
),
isto é interpretado como significando o número da palavra x através da segunda para a última palavra.
Então, depois que sua “linha de comando inteira digitada até agora”
echo "This is a sentence. " "This is a sentence. "
então !#:1-
expande para "This is a sentence. "
,
porque cada uma das strings "This is a sentence. "
citadas conta como uma palavra,
e assim !#:1-
é equivalente a !#:1
(apenas palavra número 1).
Então você acaba com
echo "This is a sentence. " "This is a sentence. " "This is a sentence. " >text3
O fato de que -
e >
aparecem juntos no comando é apenas uma confusão;
eles não interagem.
E o fato de que “Isto é uma frase” é citado obscurece o que está acontecendo; se você disse
echo This is a sentence. !#:* !#:1-
expandir-se-ia para
echo This is a sentence. This is a sentence. !#:1-
e daí para
echo This is a sentence. This is a sentence. This is a sentence. This is a
(porque !#:1-
se expande para a palavra número 1 até a segunda para a última palavra.)