Bash - PS1 не обновляется с правильным именем хоста после изменения имени хоста в сценарии

Ваш скрипт имеет такой отступ? разделитель для документа-документа должен быть в начале строки. У меня это работает:

#!/bin/bash
echo $(cat <<EOF
blah
EOF
)
11
05.10.2015, 20:28
1 ответ

Невозможно заставить Bash обновлять значение, в которое переводится \h. Он считывается один раз при запуске и впоследствии не изменяется. Таким образом, единственными вариантами, если вам нужно получить обновленную подсказку, являются:

  • запустить подоболочку —bash
  • заменить текущую оболочку на новую —exec bash
  • обновить PS1, заменив \hна $(hostname)или литеральную строку

Теперь подробнее о внутренностях Bash. Значение имени хоста хранится в переменной current_host_name, которая определена в shell.h:113:

.
extern char *current_host_name;

Он используется в трех местах,variables.c:695:

temp_var = set_if_not ("HOSTNAME", current_host_name);

parse.y:6039:

case 'h':
case 'H':
  t_host = savestring (current_host_name);
  if (c == 'h' && (t = (char *)strchr (t_host, '.')))
...

иy.tab.c:8333:

case 'h':
case 'H':
  t_host = savestring (current_host_name);
  if (c == 'h' && (t = (char *)strchr (t_host, '.')))
...

И значение ему присваивается только один раз (помимо инициализации пустой строкой )в функции shell_initialize()вshell.c:1918:

/* It's highly unlikely that this will change. */
if (current_host_name == 0)
  {
    /* Initialize current_host_name. */
    if (gethostname (hostname, 255) < 0)
      current_host_name = "??host??";
    else
      current_host_name = savestring (hostname);
  }

Все номера строк и имена файлов взяты из исходного кода из bash-5.1.tar.gzс зеркала на kernel.org .

2
16.11.2021, 20:22

Теги

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