Почему команда shell-expand-line GNU Readline расширяет только первое вхождение тильды (~)?

Это не вопрос изменения systemctl. Это отвлекающий маневр. systemctlзапрашивает «Policy Kit», чтобы определить, разрешено ли конкретному пользователю, вошедшему в систему определенным образом, перезагружать систему. Вам нужно изменить в Policy Kit, кому разрешено выполнять действие org.freedesktop.login1.reboot. Возможно, вы захотите изменить правила для трех классов журналов -с yesнаauth_admin(илиauth_admin_keep).

Дополнительная литература

7
13.08.2019, 23:31
1 ответ

Если вы посмотрите на его исходный код , вы увидите, что shell-expand-lineна самом деле должен называтьсяshell-expand-line-as-if-it-were-a-word:

>> bashline.c
static int
shell_expand_line (count, ignore)
     int count, ignore;
{
    ...
      w->word = savestring (rl_line_buffer);
      w->flags = rl_explicit_arg ? (W_NOPROCSUB|W_NOCOMSUB) : 0;
      expanded_string = expand_word (w, rl_explicit_arg ? Q_HERE_DOCUMENT : 0);
>>> subst.c
/* Expand WORD, performing word splitting on the result.  This does
   parameter expansion, command substitution, arithmetic expansion,
   word splitting, and quote removal. */

WORD_LIST *
expand_word (word, quoted)
     WORD_DESC *word;
     int quoted;

Обратите внимание, что этот комментарий не включает расширение имени файла или тильды. Так что это в основном случайность, что это работает даже для первой тильды (тильда имеет значение только в начале слова, в любом случае ). Но это также будет выполнять замену процессов, что также не упоминается. Тяжелая работа находится в функции expand_word_internalв том же файле.

rl_explicit_argв первом фрагменте означает, что если вы нажмете Esc -1 или Alt -2 перед комбинацией клавиш, привязанной к shell-expand-line, удаление кавычек не произойдет и процесс/команда замена будет. Довольно интуитивно, не так ли?

Вы можете попробовать отправить отчет об ошибке, но, вероятно, в bash уже есть тысячи подобных ограничений и особых случаев.

6
27.01.2020, 20:19

Теги

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