Patch for "doveadm -f table" nit (was Re: Dovecot current number of connections being used.)
doveadm who -1 2>/dev/null | wc -l
You have to redirect stderr to /dev/null because that's where the first header line is written to. The default format style (table) is inconsistent with the other formats (flow,pager,tab) that write headers and data to stdout. The following patch will pick this nit. This patch will require modifications to scripts that rely on doveadm writing headers to stderr. For example, the above doveadm command could be modified to doveadm who -1 | grep -vc '^username' -------------------------------------------------------------------------------- --- a/dovecot-2.2.16.rc1/src/doveadm/doveadm-print-table.c Wed Mar 18 15:40:40 2015 +++ b/dovecot-2.2.16.rc1/src/doveadm/doveadm-print-table.c Wed Mar 18 15:41:18 2015 @@ -151,3 +151,3 @@ for (i = 0; i < count; i++) { - if (i > 0) fprintf(stderr, " "); + if (i > 0) printf(" "); @@ -155,3 +155,3 @@ DOVEADM_PRINT_HEADER_FLAG_RIGHT_JUSTIFY) == 0) { - fprintf(stderr, "%-*s", (int)headers[i].length, + printf("%-*s", (int)headers[i].length, headers[i].title); @@ -158,3 +158,3 @@ } else { - fprintf(stderr, "%*s", (int)headers[i].length, + printf("%*s", (int)headers[i].length, headers[i].title); @@ -162,3 +162,3 @@ } - fprintf(stderr, "\n"); + printf("\n"); } -------------------------------------------------------------------------------- Joseph Tam <jtam.home@gmail.com>
On 19 Mar 2015, at 02:37, Joseph Tam <jtam.home@gmail.com> wrote:
doveadm who -1 2>/dev/null | wc -l
You have to redirect stderr to /dev/null because that's where the first header line is written to. The default format style (table) is inconsistent with the other formats (flow,pager,tab) that write headers and data to stdout.
The following patch will pick this nit. This patch will require modifications to scripts that rely on doveadm writing headers to stderr. For example, the above doveadm command could be modified to
doveadm who -1 | grep -vc '^username'
There's no reason why flow and pager should write headers to stderr because it would always result only in a mess. But instead of changing table headers to write to stdout, I think a better fix would be to make tab formatter write headers to stderr. Including headers in stdout makes it more difficult to write scripts that access the actual data. For example now you can do "doveadm who -1 | sort" and the output will work. If headers were written to stdout you'd have to make it more complicated. Also you can now easily specify what you want to do with the headers, 2>/dev/null if you don't care about them or 2>&1 if you want to include them in stdout (which works even after |sort).
So, I'll add in my v2.3 TODO that tab formatter should write to stderr..
On Thu, 19 Mar 2015, Timo Sirainen wrote:
You have to redirect stderr to /dev/null because that's where the first header line is written to. The default format style (table) is inconsistent with the other formats (flow,pager,tab) that write headers and data to stdout.
There's no reason why flow and pager should write headers to stderr because it would always result only in a mess.
Right.
But instead of changing table headers to write to stdout, I think a better fix would be to make tab formatter write headers to stderr.
That would at least make the behaviour consistent.
Including headers in stdout makes it more difficult to write scripts that access the actual data. For example now you can do "doveadm who -1 | sort" and the output will work. If headers were written to stdout you'd have to make it more complicated. Also you can now easily specify what you want to do with the headers, 2>/dev/null if you don't care about them or 2>&1 if you want to include them in stdout (which works even after |sort).
I agree with the easier parsing thing for scripts. It just a little weird when you're doing piping interactively and the header pops out. Another option is to add another flag/formatter that will squelch headers.
I'm cool with whatever you implement.
Joseph Tam <jtam.home@gmail.com>
On 03/18/2015 08:49 PM, Timo Sirainen wrote:
There's no reason why flow and pager should write headers to stderr because it would always result only in a mess. But instead of changing table headers to write to stdout, I think a better fix would be to make tab formatter write headers to stderr. Including headers in stdout makes it more difficult to write scripts that access the actual data. For example now you can do "doveadm who -1 | sort" and the output will work. If headers were written to stdout you'd have to make it more complicated. Also you can now easily specify what you want to do with the headers, 2>/dev/null if you don't care about them or 2>&1 if you want to include them in stdout (which works even after |sort).
So, I'll add in my v2.3 TODO that tab formatter should write to stderr..
I've been using "-f flow fetch text | sed s/^text=//" when training spamassasin. Couldn't find a straightforward 'fetch raw message'. Seems unnecessarily awkward. Moving headers to stderr would help this, though.
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
On Thu, 19 Mar 2015, Gedalya wrote:
On 03/18/2015 08:49 PM, Timo Sirainen wrote:
There's no reason why flow and pager should write headers to stderr because it would always result only in a mess. But instead of changing table headers to write to stdout, I think a better fix would be to make tab formatter write headers to stderr. Including headers in stdout makes it more difficult to write scripts that access the actual data. For example now you can do "doveadm who -1 | sort" and the output will work. If headers were written to stdout you'd have to make it more complicated. Also you can now easily specify what you want to do with the headers, 2>/dev/null if you don't care about them or 2>&1 if you want to include them in stdout (which works even after |sort).
doveadm .... 2> /dev/null will suppress headers _and_ error messages
So, I'll add in my v2.3 TODO that tab formatter should write to stderr..
I've been using "-f flow fetch text | sed s/^text=//" when training spamassasin. Couldn't find a straightforward 'fetch raw message'. Seems unnecessarily awkward. Moving headers to stderr would help this, though.
How about a formatter option to enable/disable headers at all? Like,
who -H ps h ps --headers
Most probably it useful for scripts only, so add an option to suppress all headers will fit most case.
Steffen Kaiser -----BEGIN PGP SIGNATURE----- Version: GnuPG v1
iQEVAwUBVQqkK3z1H7kL/d9rAQJ/cwgApl5SvuwOcLTDqn0X/A9pCCQvuzX50oyW FZH43AzCVcAShxX5SE8wRhmxTfI71mjQrJkvQu1zbCfh7FAY5lNP7dtTNWZRCxtI PG1B5qfHrB/56SdnEqckYNysrF8XSoKi+0mCzzB3GaSbAWeahvVu93qh1OItfDiA 5Ago3v9l2SlJq/TM9Bo54P5jwemgI9jg9t+5PHBF7RMJY1eQ1Dd4E4IoO/PnqnzX IKL2Xgp3YBm7eNksQWsSowfPntgb56UfLQZrQWG+7pjkDpDsKxZxTStAYcVIH6pj //vTYrDnQP0JPwMe2iqhhrl3NyK4Wk7R1obWcezEcXhxEKFP5fn/Vg== =m6yz -----END PGP SIGNATURE-----
On 19 Mar 2015, at 12:25, Steffen Kaiser <skdovecot@smail.inf.fh-brs.de> wrote:
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
On Thu, 19 Mar 2015, Gedalya wrote:
On 03/18/2015 08:49 PM, Timo Sirainen wrote:
There's no reason why flow and pager should write headers to stderr because it would always result only in a mess. But instead of changing table headers to write to stdout, I think a better fix would be to make tab formatter write headers to stderr. Including headers in stdout makes it more difficult to write scripts that access the actual data. For example now you can do "doveadm who -1 | sort" and the output will work. If headers were written to stdout you'd have to make it more complicated. Also you can now easily specify what you want to do with the headers, 2>/dev/null if you don't care about them or 2>&1 if you want to include them in stdout (which works even after |sort).
doveadm .... 2> /dev/null will suppress headers _and_ error messages
Hm. Yeah, that's not good.
So, I'll add in my v2.3 TODO that tab formatter should write to stderr..
I've been using "-f flow fetch text | sed s/^text=//" when training spamassasin. Couldn't find a straightforward 'fetch raw message'. Seems unnecessarily awkward. Moving headers to stderr would help this, though.
How about a formatter option to enable/disable headers at all? Like,
who -H ps h ps --headers
Most probably it useful for scripts only, so add an option to suppress all headers will fit most case.
I guess that would be best. Added -h parameter now to hg. I didn't change the stdout/stderr behavior for now - have to wait until v2.3 for that. I guess that could also be changed to stdout then.
On 03/20/2015 02:47 PM, Timo Sirainen wrote:
Added -h parameter now to hg.
Using 2.2.18. With -f table this behaves as expected, however with -t tab the output seems to include the separating tabs of the header line prepended to the first line of output. In other words, the header line is printed partially - only the tabs, no actual headers and no newline.
On 05/24/2015 03:08 AM, Gedalya wrote:
On 03/20/2015 02:47 PM, Timo Sirainen wrote:
Added -h parameter now to hg.
Using 2.2.18. With -f table this behaves as expected, however with -t tab the output seems to include the separating tabs of the header line prepended to the first line of output. In other words, the header line is printed partially - only the tabs, no actual headers and no newline.
Timo?
On 07/03/2015 05:48 PM, Gedalya wrote:
On 05/24/2015 03:08 AM, Gedalya wrote:
On 03/20/2015 02:47 PM, Timo Sirainen wrote:
Added -h parameter now to hg.
Using 2.2.18. With -f table this behaves as expected, however with -t tab the output seems to include the separating tabs of the header line prepended to the first line of output. In other words, the header line is printed partially - only the tabs, no actual headers and no newline.
Timo?
On 19-3-2015 9:30, Gedalya wrote:
On 03/18/2015 08:49 PM, Timo Sirainen wrote:
There's no reason why flow and pager should write headers to stderr because it would always result only in a mess. But instead of changing table headers to write to stdout, I think a better fix would be to make tab formatter write headers to stderr. Including headers in stdout makes it more difficult to write scripts that access the actual data. For example now you can do "doveadm who -1 | sort" and the output will work. If headers were written to stdout you'd have to make it more complicated. Also you can now easily specify what you want to do with the headers, 2>/dev/null if you don't care about them or 2>&1 if you want to include them in stdout (which works even after |sort).
So, I'll add in my v2.3 TODO that tab formatter should write to stderr..
I've been using "-f flow fetch text | sed s/^text=//" when training spamassasin. Couldn't find a straightforward 'fetch raw message'. Seems unnecessarily awkward. Moving headers to stderr would help this, though.
I think that that is sort of forgoing the pupsoe of stderr.
Moving things to stderr for reasons of parsing and other trivia, just complicates other sysadmin scripts where it is expected that only errors are written to stderr. I would suggest to write all std-info just to regular stdout, and deal with reporting tools just there.
just my 2 cts,
--WjW
participants (5)
-
Gedalya
-
Joseph Tam
-
Steffen Kaiser
-
Timo Sirainen
-
Willem Jan Withagen