Поскольку никто не думал, что опцию, которую Вы ищете, стоило реализовать, таким образом, нет никакого синтаксиса для запроса этого.
Рассмотрите, как это должно было бы быть реализовано. Во-первых, необходимо было бы искать в конец файла, сканирование назад для выяснения, где Энная последняя строка начинается, обратите внимание на то положение, ищите назад на начало и затем распечатайте строки, пока Вы не достигаете положения, которое Вы помнили. Это намного более сложно, чем какой head
обычно делает. (С другой стороны, Вы могли считать весь файл в память, отбросить N последние строки и распечатать остальных.), Что еще более важно, хотя, это не работало бы с unseekable потоками.
С другой стороны, tail
функции довольно просты реализовать. Это никогда не должно хранить больше, чем строки N (в -n -N
случай). Для -n +N
случитесь это просто должно рассчитать, сколько строк для пропуска, прежде чем это начнет печатать их.
Да, используется история.
! #
- это указатель события истории
это относится ко всей набранной командной строке.
: *
- обозначение слова (диапазона), которое относится ко всем словам, кроме 0-го.
Итак, после того, как вы наберете echo «Это предложение».
,
затем ! #: *
заменяется на «Это предложение».
.
И x - y
(где x и y - целые числа)
- это обозначение слова (диапазона), которое относится к номеру слова x через номер слова y .
Если y опущено ( x -
),
это интерпретируется как обозначение номера слова x от предпоследнего слова.
Итак, после того, как ваша «вся командная строка введена до сих пор» стоит как
echo "This is a sentence. " "This is a sentence. "
затем ! #: 1-
заменяется на «Это предложение».
,
потому что каждая из цитируемых «Это предложение».
строк считается одним словом,
и поэтому ! #: 1-
эквивалентно ! #: 1
(просто слово номер 1).
Таким образом, вы получаете
echo "This is a sentence. " "This is a sentence. " "This is a sentence. " >text3
. Тот факт, что -
и >
появляются вместе в команде, это просто путаница;
они не взаимодействуют.
И то, что «Это приговор». цитируется, скрывает происходящее; если вы сказали
echo This is a sentence. !#:* !#:1-
, он расширится до
echo This is a sentence. This is a sentence. !#:1-
, а затем до
echo This is a sentence. This is a sentence. This is a sentence. This is a
(потому что ! #: 1-
расширяется до слова с номером 1 через второе до последнего слова.)
Я экспериментировал с !#:*
и !#:1
. Я не смог найти много исходников в интернете для этого, но я уверен, что вы введете эхо "Sample text"
и тогда вы сможете использовать !#:* !#:1 !#:2->текст
, а !#:* временно сохранит там содержимое строки. Я не уверен, что это своего рода условный оператор, так как я не смог найти на нем много ресурсов, но кажется, что это полезно, когда вы пытаетесь закодировать одно и то же и хотите сохранить нажатия клавиш. Я пробовал это в bash:
echo "test" !#:* !#:1 !#:2 !#:3 !#:4->test1
Вот что я получаю в test1:
test test test test
Pretty tool.
Хорошую документацию по шпаргалке Питера Круминса по истории бэша вы можете найти здесь .
Так как вы поняли !#
, то мы просто объясняем :*
и :1
.
*
: ссылайтесь на все слова, кроме нуля. x-
: обращайтесь к словам от х до второго до последнего слова. : ваша команда:
echo "This is a sentence. " !#:* !#:1-
!#:*
получает все, кроме нуля, поэтому получает : это предложение. "
, ваша команда становится эхом "Это предложение. "Это предложение. ".
!#:1-
получает слово от 1 до 2 до последнего слова, что означает "Это предложение". "
снова ваша команда становится эхом "Это предложение". "Это предложение. "Это предложение. "
Как указывает @glennjackman, все это описано в руководстве по bash. Найдите на странице руководства РАСШИРЕНИЕ ИСТОРИИ
.
! #
- это указатель события , означающий «вся командная строка, набранная на данный момент». В вашем примере это echo «Это предложение.»
, включая конечный пробел после последней двойной кавычки.
:
отделяет указатель события (! #
) от указателя слова ( *
).
*
- указатель слова , означающий «все слова в событии, кроме нуля»
Итак echo «Это предложение».! #: *
расширяется до
echo "This is a sentence. " "This is a sentence. " $
(знак доллара мой, обозначающий конец пробела), который перекликается с
This is a sentence. This is a sentence. $
на терминал (опять же, знак доллара мой, обозначающий конец пробела).
Второй указатель события : указатель слова пара (! #: 1-
) действует аналогичным образом (но имейте в виду, что он должен иметь дело с тем фактом, что командная строка была значительно расширена теперь, когда первая пара позиционных обозначений была оценена).