История Bash в сценарии: '! #:*'

Поскольку никто не думал, что опцию, которую Вы ищете, стоило реализовать, таким образом, нет никакого синтаксиса для запроса этого.

Рассмотрите, как это должно было бы быть реализовано. Во-первых, необходимо было бы искать в конец файла, сканирование назад для выяснения, где Энная последняя строка начинается, обратите внимание на то положение, ищите назад на начало и затем распечатайте строки, пока Вы не достигаете положения, которое Вы помнили. Это намного более сложно, чем какой head обычно делает. (С другой стороны, Вы могли считать весь файл в память, отбросить N последние строки и распечатать остальных.), Что еще более важно, хотя, это не работало бы с unseekable потоками.

С другой стороны, tailфункции довольно просты реализовать. Это никогда не должно хранить больше, чем строки N (в -n -N случай). Для -n +N случитесь это просто должно рассчитать, сколько строк для пропуска, прежде чем это начнет печатать их.

4
22.08.2014, 03:12
4 ответа

Да, используется история. ! # - это указатель события истории это относится ко всей набранной командной строке. : * - обозначение слова (диапазона), которое относится ко всем словам, кроме 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 через второе до последнего слова.)

11
27.01.2020, 20:45

Я экспериментировал с !#:* и !#:1. Я не смог найти много исходников в интернете для этого, но я уверен, что вы введете эхо "Sample text" и тогда вы сможете использовать !#:* !#:1 !#:2->текст, а !#:* временно сохранит там содержимое строки. Я не уверен, что это своего рода условный оператор, так как я не смог найти на нем много ресурсов, но кажется, что это полезно, когда вы пытаетесь закодировать одно и то же и хотите сохранить нажатия клавиш. Я пробовал это в bash:

echo "test" !#:* !#:1 !#:2 !#:3 !#:4->test1

Вот что я получаю в test1:

test test test test

Pretty tool.

1
27.01.2020, 20:45

Хорошую документацию по шпаргалке Питера Круминса по истории бэша вы можете найти здесь .

Так как вы поняли !#, то мы просто объясняем :* и :1.

  • *: ссылайтесь на все слова, кроме нуля.
  • x-: обращайтесь к словам от х до второго до последнего слова.

: ваша команда:

echo "This is a sentence. " !#:* !#:1-
  • !#:* получает все, кроме нуля, поэтому получает : это предложение. ", ваша команда становится эхом "Это предложение. "Это предложение. ".

  • !#:1- получает слово от 1 до 2 до последнего слова, что означает "Это предложение". " снова ваша команда становится эхом "Это предложение". "Это предложение. "Это предложение. "

4
27.01.2020, 20:45

Как указывает @glennjackman, все это описано в руководстве по bash. Найдите на странице руководства РАСШИРЕНИЕ ИСТОРИИ .

  • ! # - это указатель события , означающий «вся командная строка, набранная на данный момент». В вашем примере это echo «Это предложение.» , включая конечный пробел после последней двойной кавычки.

  • : отделяет указатель события (! # ) от указателя слова ( * ).

  • * - указатель слова , означающий «все слова в событии, кроме нуля»

Итак echo «Это предложение».! #: * расширяется до

echo "This is a sentence. " "This is a sentence. " $

(знак доллара мой, обозначающий конец пробела), который перекликается с

This is a sentence.  This is a sentence. $

на терминал (опять же, знак доллара мой, обозначающий конец пробела).

Второй указатель события : указатель слова пара (! #: 1- ) действует аналогичным образом (но имейте в виду, что он должен иметь дело с тем фактом, что командная строка была значительно расширена теперь, когда первая пара позиционных обозначений была оценена).

3
27.01.2020, 20:45

Теги

Похожие вопросы