diff --git a/man/standard-specifiers.xml b/man/standard-specifiers.xml
index f1666365b9c..abbd47f7782 100644
--- a/man/standard-specifiers.xml
+++ b/man/standard-specifiers.xml
@@ -34,6 +34,11 @@
Short host name
The hostname of the running system, truncated at the first dot to remove any domain component.
+
+ %R
+ Pretty host name
+ The pretty hostname of the running system, as read from the PRETTY_HOSTNAME= field of /etc/machine-info. If not set, resolves to the short hostname. See machine-info5 for more information.
+
%m
Machine ID
diff --git a/man/systemd.unit.xml b/man/systemd.unit.xml
index b20072f0a2a..8f2f6497470 100644
--- a/man/systemd.unit.xml
+++ b/man/systemd.unit.xml
@@ -2031,6 +2031,8 @@ Note that this setting is not influenced by the Us
%l
+
Short host name
The hostname of the running system at the point in time the unit configuration is loaded, truncated at the first dot to remove any domain component.
@@ -2062,6 +2064,13 @@ Note that this setting is not influenced by the Us
Unescaped prefix name
Same as %p, but with escaping undone.
+
+
+ %R
+ Pretty host name
+ The pretty hostname of the running system at the point in time the unit configuration is loaded, as read from the PRETTY_HOSTNAME= field of /etc/machine-info. If not set, resolves to the short hostname. See machine-info5 for more information.
+
%s
User shell
diff --git a/src/shared/specifier.c b/src/shared/specifier.c
index 8c5a4fa831f..a02012407ba 100644
--- a/src/shared/specifier.c
+++ b/src/shared/specifier.c
@@ -223,6 +223,21 @@ int specifier_short_host_name(char specifier, const void *data, const char *root
return 0;
}
+int specifier_pretty_host_name(char specifier, const void *data, const char *root, const void *userdata, char **ret) {
+ char *n = NULL;
+
+ assert(ret);
+
+ if (get_pretty_hostname(&n) < 0) {
+ n = gethostname_short_malloc();
+ if (!n)
+ return -ENOMEM;
+ }
+
+ *ret = n;
+ return 0;
+}
+
int specifier_kernel_release(char specifier, const void *data, const char *root, const void *userdata, char **ret) {
struct utsname uts;
char *n;
diff --git a/src/shared/specifier.h b/src/shared/specifier.h
index eae5f12ad76..2f2553cfdc0 100644
--- a/src/shared/specifier.h
+++ b/src/shared/specifier.h
@@ -21,6 +21,7 @@ int specifier_machine_id(char specifier, const void *data, const char *root, con
int specifier_boot_id(char specifier, const void *data, const char *root, const void *userdata, char **ret);
int specifier_host_name(char specifier, const void *data, const char *root, const void *userdata, char **ret);
int specifier_short_host_name(char specifier, const void *data, const char *root, const void *userdata, char **ret);
+int specifier_pretty_host_name(char specifier, const void *data, const char *root, const void *userdata, char **ret);
int specifier_kernel_release(char specifier, const void *data, const char *root, const void *userdata, char **ret);
int specifier_architecture(char specifier, const void *data, const char *root, const void *userdata, char **ret);
int specifier_os_id(char specifier, const void *data, const char *root, const void *userdata, char **ret);
@@ -75,6 +76,7 @@ int specifier_var_tmp_dir(char specifier, const void *data, const char *root, co
{ 'B', specifier_os_build_id, NULL }, \
{ 'H', specifier_host_name, NULL }, \
{ 'l', specifier_short_host_name, NULL }, \
+ { 'R', specifier_pretty_host_name,NULL }, \
{ 'm', specifier_machine_id, NULL }, \
{ 'M', specifier_os_image_id, NULL }, \
{ 'o', specifier_os_id, NULL }, \
diff --git a/src/test/test-specifier.c b/src/test/test-specifier.c
index ded2dcd55a0..231625de958 100644
--- a/src/test/test-specifier.c
+++ b/src/test/test-specifier.c
@@ -73,7 +73,7 @@ TEST(specifier_printf) {
assert_se(streq(w, "xxx a=AAAA b=BBBB e= yyy"));
free(w);
- r = specifier_printf("machine=%m, boot=%b, host=%H, version=%v, arch=%a, empty=%e", SIZE_MAX, table, NULL, NULL, &w);
+ r = specifier_printf("machine=%m, boot=%b, host=%H, pretty=%R, version=%v, arch=%a, empty=%e", SIZE_MAX, table, NULL, NULL, &w);
assert_se(r >= 0);
assert_se(w);
puts(w);