<varlistentry>
<term><option>--no-output</option></term>
- <listitem><para>Do not print passwords to standard output.
- This is useful if you want to store a password in kernel
- keyring with <option>--keyname</option> but do not want it
- to show up on screen or in logs.</para></listitem>
+ <listitem><para>Do not print passwords to standard output. This is useful if you want to store a
+ password in kernel keyring with <option>--keyname=</option> but do not want it to show up on screen
+ or in logs.</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>-n</option></term>
+
+ <listitem><para>By default, when writing the acquired password to standard output it is suffixed by a
+ newline character. This may be turned off with the <option>-n</option> switch, similar to the switch
+ of the same name of the <citerefentry
+ project='man-pages'><refentrytitle>echo</refentrytitle><manvolnum>1</manvolnum></citerefentry>
+ command.</para></listitem>
</varlistentry>
<xi:include href="standard-options.xml" xpointer="help" />
static bool arg_multiple = false;
static bool arg_no_output = false;
static AskPasswordFlags arg_flags = ASK_PASSWORD_PUSH_CACHE;
+static bool arg_newline = true;
STATIC_DESTRUCTOR_REGISTER(arg_message, freep);
" --accept-cached Accept cached passwords\n"
" --multiple List multiple passwords if available\n"
" --no-output Do not print password to standard output\n"
+ " -n Do not suffix password written to standard output with\n"
+ " newline\n"
"\nSee the %2$s for details.\n",
program_invocation_short_name,
link,
/* Note the asymmetry: the long option --echo= allows an optional argument, the short option does
* not. */
- while ((c = getopt_long(argc, argv, "+he", options, NULL)) >= 0)
+ while ((c = getopt_long(argc, argv, "+hen", options, NULL)) >= 0)
switch (c) {
arg_credential_name = optarg;
break;
+ case 'n':
+ arg_newline = false;
+ break;
+
case '?':
return -EINVAL;
return log_error_errno(r, "Failed to query password: %m");
STRV_FOREACH(p, l) {
- if (!arg_no_output)
- puts(*p);
+ if (!arg_no_output) {
+ if (arg_newline)
+ puts(*p);
+ else
+ fputs(*p, stdout);
+ }
+
+ fflush(stdout);
if (!arg_multiple)
break;