Замена терминала! сопровождаемый числом с командой

12

Я очень озадачен моим терминальным сеансом Ubuntu, кажется, он заменяет разделы в командах, которые начинаются с, !после которых следует число, казалось бы, случайных команд Он делает это, !87заменяя его, screen -lа также !88и заменяя его ls.

Любые идеи, почему это происходит, будут высоко оценены.

usbpc102
источник

Ответы:

20

Это bashрасширение истории, например

!87

повторно выполняет команду из строки истории 87.

Описание этой функции вы найдете в man bashразделе «РАСШИРЕНИЕ ИСТОРИИ»:

       An  event  designator  is  a  reference  to a command line entry in the
       history list.  Unless the reference is absolute, events are relative to
       the current position in the history list.

       !      Start  a  history substitution, except when followed by a blank,
              newline, carriage return, = or ( (when the extglob shell  option
              is enabled using the shopt builtin).
       !n     Refer to command line n.
       !-n    Refer to the current command minus n.

Чтобы быстро вызвать последнюю команду, выполните !-1и для пятой последней команды !-5. Удобный синоним !-1это !!- если вы назвали , например , apt install somethingи забыли sudo, просто выполнить , sudo !!и вы хорошо.

Только обратная косая черта ( \ ) и одинарные кавычки могут указывать символ расширения истории.

Чтобы избежать расширения истории, вы должны либо экранировать восклицательный знак обратной косой чертой ( \!), либо использовать одинарные кавычки ( '!').

Десерт
источник
3
чтобы передать литерал !своим командам и избежать расширения истории, вам нужно заключить их в одинарные кавычки или экранировать их: foo '!87'или foo \!87. (двойные кавычки будут также выполнять расширение на их содержание.)
донкихотская