Ваш скрипт имеет такой отступ? разделитель для документа-документа должен быть в начале строки. У меня это работает:
#!/bin/bash
echo $(cat <<EOF
blah
EOF
)
Невозможно заставить Bash обновлять значение, в которое переводится \h
. Он считывается один раз при запуске и впоследствии не изменяется. Таким образом, единственными вариантами, если вам нужно получить обновленную подсказку, являются:
bash
exec bash
\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 .