Я установил имя компьютера в нижнем регистре в свойствах системы.
В cmd.exe
это показано в нижнем регистре.
Тем не менее, в Windows 10 Bash он отображается в верхнем регистре, хотя файл /etc/hostname
был обновлен до нижнего регистра.
Я установил имя компьютера в нижнем регистре в свойствах системы.
В cmd.exe
это показано в нижнем регистре.
Тем не менее, в Windows 10 Bash он отображается в верхнем регистре, хотя файл /etc/hostname
был обновлен до нижнего регистра.
Изменить: теперь это было реализовано ; капитализация, установленная в свойствах системы, теперь будет сохранена.
У меня была такая же проблема. Оказывается, вы не можете просто изменить /etc /hostname изнутри Bash в Ubuntu в Windows (BUW), потому что /etc /hostname генерируется каждый раз, когда вы его запускаете. BUW, похоже, использует имя NetBIOS вашего компьютера для генерации /etc /hostname, которое, согласно этой статье, «представлено в верхнем регистре, где алгоритм перевода из нижнего в верхний регистр зависит от набора символов OEM». Когда вы переименовываете компьютер в Windows через « Settings > System > About
или « Control Panel > System and Security > System
, он сохраняет заданную вами заглавную букву, но имя NetBIOS преобразуется в верхний регистр. При этом можно изменить имя NetBIOS на строчные, используя функцию Windows API SetComputerName
. Вот небольшая программа на C (не в Юникоде), которая устанавливает имя NetBIOS своим первым аргументом (требует прав администратора):
#define _WIN32_WINNT 0x0500
#include <sdkddkver.h>
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <stdio.h>
int main(int argc, char **argv) {
if (argc != 2) {
fprintf(stderr, "Usage: %s <New NetBIOS name>\n", argv[0]);
return 1;
}
if (SetComputerNameA(argv[1]) == 0) {
LPSTR error_message = NULL;
DWORD error_code = GetLastError();
FormatMessageA(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
error_code,
0,
(LPSTR)&error_message,
0,
NULL
);
fprintf(stderr, "SetComputerNameA error (%lu)", error_code);
if (error_message != NULL) {
fprintf(stderr, ": %s", error_message);
LocalFree(error_message);
}
fprintf(stderr, "\n");
return 2;
}
else {
printf("NetBIOS name set to \"%s\"\n", argv[1]);
return 0;
}
}
Используйте его на свой страх и риск, так как я не совсем уверен, что наличие имени NetBIOS без прописных букв имеет какие-либо неблагоприятные последствия (это может нарушить то, что зависит от DnsHostnameToComputerName). В конечном итоге я не уверен, намеренно ли / необходимо ли для BUW использовать имя NetBIOS; Я спросил об этом на трекере проблем BUW.
В качестве альтернативы, если вы не хотите изменять имя NetBIOS, вы можете придумать какой-то способ изменения имени хоста при каждом запуске BUW с использованием sudo hostname prophet-w10
(а затем exec bash
чтобы оно появилось в приглашении).
Эстетика этого меня тоже раздражала. Вместо того, чтобы пытаться заставить hostname
возвращать что-то строчное, я просто атаковал, как bash
отображает подсказку. Я отредактировал .bashrc
(который специфичен для установки Windows и, следовательно, вряд ли будет повторно использован на другом компьютере), чтобы сделать следующее с приглашением переменной PS1
# Annoyingly the windows hostname is UPPERCASE which really doesn't look
# good on linux. So for this machine I'm going to grab the hostname and
# hardcode it into the prompt
HN=`hostname`
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@${HN,,}\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@${HN,,}:\w\$ '
fi
unset color_prompt force_color_prompt
# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@${HN,,}: \w\a\]$PS1"
;;
*)
;;
esac
Вышеприведенное, по существу, жестко кодирует строчное имя машины в PS1
когда она создается с использованием функции bash 4.0
которой $(A,,)
преобразует строку A в строчные. Хотя это и не элегантное решение проблемы, это делает оболочку похожей на более нормальную оболочку linux!