Ожидает закрытия }
. Вы вошли в список с одной командой, date}
и новой строкой, поэтому вы все еще находитесь внутри группы команд и можете либо добавить другую команду в список, либо завершить его.
Таким образом, он не ждет стандартного ввода (точно), он ждет, пока вы завершите команду, которую вы запустили в первой строке. Если вы введете здесь }
, вы (вероятно) получите сообщение об ошибке от команды date
о том, что она не понимает "}
".
{
и }
- допустимые аргументы для общих команд, как показано в пункте 1. Например, find
использует {}
в качестве аргумента. .
В частности, только слова « {
» и «}
» являются зарезервированными словами . Зарезервированные слова в оболочке имеют значение только тогда, когда они даны как отдельное слово целиком и только там, где они конкретно ожидаются. Наиболее важное место, где они ожидаются, - это начало команды.
Точка с запятой или новая строка означает, что }
появляется в начале следующей команды в списке, где его можно распознать как зарезервированное слово с учетом его особой обработки.Это указано в POSIX для грамматики оболочки :
Это правило также подразумевает, что зарезервированные слова не распознаются, за исключением определенных позиций во входных данных, например, после
или
; грамматика предполагает, что если зарезервированное слово предназначено, оно правильно разграничено пользователем
. Было бы неприятно, если бы «then», другое зарезервированное слово, нельзя было использовать как обычное слово, так что в основном это имеет смысл. (
и )
, напротив, являются операторами, могут появляться где угодно, и их нужно экранировать, если они используются для своих буквальных значений. По сути, это исторический артефакт, и, возможно, будет сделан более последовательный выбор в том или ином направлении, или, возможно, потребуется более сложный синтаксический анализатор.
В частности, для Bash фигурные скобки для группировки команд также необходимо отличать от фигурных скобок для раскрытия фигурных скобок , а синтаксический анализатор делает предположение, что вы вряд ли будете расширять фигурные скобки для команды, начинающейся с пространство.
Существует выбор, поддерживать ли историческую совместимость в крайнем случае или нет, и некоторые другие оболочки, такие как zsh, имеют более умные синтаксические анализаторы и могут работать с {date}
в том смысле, который вы намеревались .
Самым чистым эквивалентом POSIX будет
tail -r
, поскольку
-r Reverse. Copies lines from the specified starting point in
the file in reverse order. The default for r is to print the
entire file in reverse order.
был принят для следующего выпуска POSIX (и, надеюсь, скоро он будет поддерживаться на всех платформы).
Если tail -r
недоступен, можно успешно использовать «классические» инструменты обработки текста - как вы и другие показали - для переворота строк в файле.
Помимо удобочитаемости и краткости, даже старый ed
может это сделать:
ed -s infile <<\IN
g/^/m0
,p
q
IN
или, если это результат конвейера, который вы хотите изменить, - прочитать его в текстовом буфере во-первых:
ed -s <<\IN
r ! your | pipeline | goes | here
g/^/m0
,p
q
IN
Я предпочитаю ви себя.
Командный режим, конечно:
:g/^/m0
Вы всегда можете указать :g диапазон, если не хотите реверсировать весь файл, при условии, что вы обращаете внимание на то, где и как вы перемещаете объекты:
:1,10g/^/m0
Переключатель «-r» на tail не соответствует стандарту POSIX -на момент написания этой публикации:
tail [-f] [-c number|-n number] [file]