Пока я гуглю, как настроить приглашение оболочки через переменную PS1, я вижу таблицы специальных символов, которые можно использовать. В частности:
\! the history number of this command
\# the command number of this command
«Номер истории», кажется, более часто используется, и я знаю, как использовать такие команды, как !523
для восстановления команд из истории. Но я не могу понять, имеет ли «номер команды» аналогичные функции. Я попытался вставить \#
свою переменную PS1, и она, похоже, выводит количество команд, введенных в конкретном сеансе (в отличие от того \!
, который сохраняется после выхода из системы / выхода).
Кто-нибудь знает, как использовать «номер команды» удобным или осмысленным способом?
bash
command-line
command-history
лагранжиан
источник
источник
Ответы:
Номер команды Bash только для отображения.
Сначала немного предыстории из
bashref
:Погружаясь через источник,
parse.y
мы видим, что'\#'
разрешается глобальная статическая переменнаяcurrent_command_number
:который имеет только одно использование: in
eval.c
, он увеличивается при запуске команды:Все, что хранится, это число, а не фактическая команда или даже эквивалентный номер истории. Таким образом, при выполнении каждой команды bash забывает, какая команда связана с каким номером команды, делая номер команды непригодным для чего-либо, кроме ссылки на просмотр и прокрутку.
источник
Насколько я могу судить (и это, кажется, подтверждается вашими исследованиями), нет способа ссылаться на это магическое число в интерактивном режиме, а не через
fc
или!n
ярлыки. Похоже, что они, безусловно, относятся только к абсолютной позиции в списке истории, а не к относительной позиции с момента запуска этой конкретной оболочки (что\#
означает, как вы правильно указали).Единственный способ сделать это лучше - установить следующее:
Сюда:
1000
, что облегчает определение того, где я нахожусь в сеансеПо сути, это изменило мой измененный запрос (
PS1="\\!$ "
) из:чтобы:
... что делает его немного чище при запуске. Но это, вероятно, не тот ответ, который вы искали. :)
(Кстати, я также посмотрел на zsh для решения, и кажется, что оно просто не имеет эквивалента
\#
, так что это тоже не помогает.)источник