Hi Berny,
On 1/21/21 10:01 PM, Bernhard Voelker wrote:
quoted
On 1/21/21 7:39 PM, Alex Henrie wrote:
quoted
That said, I would love to see `tee -q` added to a future revision of
POSIX and adopted everywhere.
I like the idea.
We have been living for decades without a terminating "pipe end piece",
so why hurrying a new option into an implementation of 'tee'?
Instead, this could be discussed thoroughly and specified by the OpenGroup
and nailed down in a new POSIX issue, and then all implementations
could adopt it consistently.
Are you willing to start the discussion there?
Hi Berny,
Please don't feel like I'm hurrying with this.
I'm strongly defending my patch to try to
convince you that it's a Good Thing :-)
But if it has to undergo a long discussion
with POSIX, BSD, and whoever, that's fine by me.
I'll send a v2 with --silent in a moment.
Hi Michael,
Talking about designing new APIs,
you might have something to say here,
even if it's not for the kernel.
I also CCd a few lists that might be interested.
Please comment.
Cheers,
Alex
I am. However, the Austing Group is a nightmare in terms of login,
and doing things requiring an account; at least for me.
I'd prefer that someone else opens a bug there and links to the
discussion on an open mailing list like this one.
Do they have an open mailing list?
Is anyone hepling me report the bug to them? I should learn at this
point...
quoted
BTW: --quiet is usually used to avoid outputting of informational
messages (e.g. wget, head, tail, md5sum), while 'tee' would change
its functional behavior.
Maybe --drain, --drain-stdout, --discard-stdout (-d), --no-stdout (-n),
--elide-stdout (-e) or something similar would be more appropriate?
I stand by -q, --quiet. Conforming to: grep. Maybe there's some other.
$ man grep 2>/dev/null | sed -n '/-q, --quiet, --silent/,/^$/p'
-q, --quiet, --silent
Quiet; do not write anything to standard output.
Exit immediately with zero status if any match is
found, even if an error was detected. Also see the
-s or --no-messages option.
This is useful for using tee to just write to a file,
at the end of a pipeline,
without having to redirect to /dev/null.
Example:
echo 'foo' | sudo tee -q /etc/foo;
is equivalent to the old (and ugly)
echo 'foo' | sudo tee /etc/foo >/dev/null;
Tools with a similar interface: grep
Signed-off-by: Alejandro Colomar <redacted>
---
v2: Add --silent synonym to --quiet, per GNU guidelines.
I tested tee --silent with success.
src/tee.c | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
@@ -93,6 +98,7 @@ Copy standard input to each FILE, and also to standard output.\n\"), stdout);fputs(_("\-pdiagnoseerrorswritingtononpipes\n\+-q,--quiet,--silentdon'twritetostandardoutput\n\--output-error[=MODE]setbehavioronwriteerror.SeeMODEbelow\n\"), stdout);fputs(HELP_OPTION_DESCRIPTION,stdout);
@@ -130,6 +136,7 @@ main (int argc, char **argv)append=false;ignore_interrupts=false;+quiet=false;while((optc=getopt_long(argc,argv,"aip",long_options,NULL))!=-1){
@@ -151,6 +158,10 @@ main (int argc, char **argv)output_error=output_error_warn_nopipe;break;+case'q':+quiet=true;+break;+case_GETOPT_HELP_CHAR;case_GETOPT_VERSION_CHAR(PROGRAM_NAME,AUTHORS);
@@ -235,8 +246,9 @@ tee_files (int nfiles, char **files)break;/* Write to all NFILES + 1 descriptors.-Standardoutputisthefirstone.*/-for(i=0;i<=nfiles;i++)+Standardoutputisthefirstone.+If'quiet'istrue,writetodescriptors1andabove(omitstdout)*/+for(i=quiet;i<=nfiles;i++)if(descriptors[i]&&fwrite(buffer,bytes_read,1,descriptors[i])!=1){
I added a few FreeBSD CCs that I found on their tee.c's git blame,
because the freebsd list rejects external mail.
Please have a look at the proposal below, and the discussion that
started on gnu coreutil's list.
On 1/22/21 12:12 AM, Alejandro Colomar wrote:
quoted hunk
This is useful for using tee to just write to a file,
at the end of a pipeline,
without having to redirect to /dev/null.
Example:
echo 'foo' | sudo tee -q /etc/foo;
is equivalent to the old (and ugly)
echo 'foo' | sudo tee /etc/foo >/dev/null;
Tools with a similar interface: grep
Signed-off-by: Alejandro Colomar <redacted>
---
v2: Add --silent synonym to --quiet, per GNU guidelines.
I tested tee --silent with success.
src/tee.c | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
@@ -93,6 +98,7 @@ Copy standard input to each FILE, and also to standard output.\n\"), stdout);fputs(_("\-pdiagnoseerrorswritingtononpipes\n\+-q,--quiet,--silentdon'twritetostandardoutput\n\--output-error[=MODE]setbehavioronwriteerror.SeeMODEbelow\n\"), stdout);fputs(HELP_OPTION_DESCRIPTION,stdout);
@@ -130,6 +136,7 @@ main (int argc, char **argv)append=false;ignore_interrupts=false;+quiet=false;while((optc=getopt_long(argc,argv,"aip",long_options,NULL))!=-1){
@@ -151,6 +158,10 @@ main (int argc, char **argv)output_error=output_error_warn_nopipe;break;+case'q':+quiet=true;+break;+case_GETOPT_HELP_CHAR;case_GETOPT_VERSION_CHAR(PROGRAM_NAME,AUTHORS);
@@ -235,8 +246,9 @@ tee_files (int nfiles, char **files)break;/* Write to all NFILES + 1 descriptors.-Standardoutputisthefirstone.*/-for(i=0;i<=nfiles;i++)+Standardoutputisthefirstone.+If'quiet'istrue,writetodescriptors1andabove(omitstdout)*/+for(i=quiet;i<=nfiles;i++)if(descriptors[i]&&fwrite(buffer,bytes_read,1,descriptors[i])!=1){
This is useful for using tee to just write to a file,
at the end of a pipeline,
without having to redirect to /dev/null
Example:
echo 'foo' | sudo tee -q /etc/foo;
is equivalent to the old (and ugly)
echo 'foo' | sudo tee /etc/foo >/dev/null;
---
v2: Add --silent synonym to --quiet, per GNU guidelines.
I tested --silent with success.
v3: Added -q to opstring, which I removed by accident in v2.
I tested all -q, --quiet and --silent this time.
src/tee.c | 18 +++++++++++++++---
1 file changed, 15 insertions(+), 3 deletions(-)
@@ -93,6 +98,7 @@ Copy standard input to each FILE, and also to standard output.\n\"), stdout);fputs(_("\-pdiagnoseerrorswritingtononpipes\n\+-q,--quiet,--silentdon'twritetostandardoutput\n\--output-error[=MODE]setbehavioronwriteerror.SeeMODEbelow\n\"), stdout);fputs(HELP_OPTION_DESCRIPTION,stdout);
@@ -130,8 +136,9 @@ main (int argc, char **argv)append=false;ignore_interrupts=false;+quiet=false;-while((optc=getopt_long(argc,argv,"aip",long_options,NULL))!=-1)+while((optc=getopt_long(argc,argv,"aipq",long_options,NULL))!=-1){switch(optc){
@@ -151,6 +158,10 @@ main (int argc, char **argv)output_error=output_error_warn_nopipe;break;+case'q':+quiet=true;+break;+case_GETOPT_HELP_CHAR;case_GETOPT_VERSION_CHAR(PROGRAM_NAME,AUTHORS);
@@ -235,8 +246,9 @@ tee_files (int nfiles, char **files)break;/* Write to all NFILES + 1 descriptors.-Standardoutputisthefirstone.*/-for(i=0;i<=nfiles;i++)+Standardoutputisthefirstone.+If'quiet'istrue,writetodescriptors1andabove(omitstdout)*/+for(i=quiet;i<=nfiles;i++)if(descriptors[i]&&fwrite(buffer,bytes_read,1,descriptors[i])!=1){
This is useful for using tee to just write to a file,
at the end of a pipeline,
without having to redirect to /dev/null
Example:
echo 'foo' | sudo tee -q /etc/foo;
is equivalent to the old (and ugly)
echo 'foo' | sudo tee /etc/foo >/dev/null;
Signed-off-by: Alejandro Colomar <redacted>
---
Resend as v3. I forgot to change the subject line.
Everything else is the same as in
[off-list ref].
src/tee.c | 18 +++++++++++++++---
1 file changed, 15 insertions(+), 3 deletions(-)
@@ -93,6 +98,7 @@ Copy standard input to each FILE, and also to standard output.\n\"), stdout);fputs(_("\-pdiagnoseerrorswritingtononpipes\n\+-q,--quiet,--silentdon'twritetostandardoutput\n\--output-error[=MODE]setbehavioronwriteerror.SeeMODEbelow\n\"), stdout);fputs(HELP_OPTION_DESCRIPTION,stdout);
@@ -130,8 +136,9 @@ main (int argc, char **argv)append=false;ignore_interrupts=false;+quiet=false;-while((optc=getopt_long(argc,argv,"aip",long_options,NULL))!=-1)+while((optc=getopt_long(argc,argv,"aipq",long_options,NULL))!=-1){switch(optc){
@@ -151,6 +158,10 @@ main (int argc, char **argv)output_error=output_error_warn_nopipe;break;+case'q':+quiet=true;+break;+case_GETOPT_HELP_CHAR;case_GETOPT_VERSION_CHAR(PROGRAM_NAME,AUTHORS);
@@ -235,8 +246,9 @@ tee_files (int nfiles, char **files)break;/* Write to all NFILES + 1 descriptors.-Standardoutputisthefirstone.*/-for(i=0;i<=nfiles;i++)+Standardoutputisthefirstone.+If'quiet'istrue,writetodescriptors1andabove(omitstdout)*/+for(i=quiet;i<=nfiles;i++)if(descriptors[i]&&fwrite(buffer,bytes_read,1,descriptors[i])!=1){
This is useful for using tee to just write to a file,
at the end of a pipeline,
without having to redirect to /dev/null
Example:
echo 'foo' | sudo tee -q /etc/foo;
is equivalent to the old (and ugly)
echo 'foo' | sudo tee /etc/foo >/dev/null;
Signed-off-by: Alejandro Colomar <redacted>
---
[...]
Hi,
Why is this a thing?
The point of tee is to write a file *and* to stdout. If you don't want use that, use:
`> file`
To overwrite.
Or
`>> file`
To append.
I guess the only reason this would be used is if you wanted to write
multiple files at the same time, which tee supports.
-Teran
Hi Teran,
The rationale is that protected files can't be modified with '>', unless
you give superuser rights to the whole shell. If you want fine-grained
control over the rights of the tools in the pipeline, you'll come to
times where you want the write step to be the only one to have those,
and you can't [sudo >] nor [sudo >>], which by the way I would consider
an even better solution, but which would require much more work, and
designing a completely new idiom for it, which would face much more
objection too.
Regards,
Alex
--
Alejandro Colomar
Linux man-pages comaintainer; https://www.kernel.org/doc/man-pages/http://www.alejandro-colomar.es/
This is useful for using tee to just write to a file,
at the end of a pipeline,
without having to redirect to /dev/null
Example:
echo 'foo' | sudo tee -q /etc/foo;
is equivalent to the old (and ugly)
echo 'foo' | sudo tee /etc/foo >/dev/null;
Signed-off-by: Alejandro Colomar <redacted>
---
Resend as v3. I forgot to change the subject line.
Everything else is the same as in
[off-list ref].
src/tee.c | 18 +++++++++++++++---
1 file changed, 15 insertions(+), 3 deletions(-)
@@ -93,6 +98,7 @@ Copy standard input to each FILE, and also to standard output.\n\"), stdout);fputs(_("\-pdiagnoseerrorswritingtononpipes\n\+-q,--quiet,--silentdon'twritetostandardoutput\n\--output-error[=MODE]setbehavioronwriteerror.SeeMODEbelow\n\"), stdout);fputs(HELP_OPTION_DESCRIPTION,stdout);
@@ -130,8 +136,9 @@ main (int argc, char **argv)append=false;ignore_interrupts=false;+quiet=false;-while((optc=getopt_long(argc,argv,"aip",long_options,NULL))!=-1)+while((optc=getopt_long(argc,argv,"aipq",long_options,NULL))!=-1){switch(optc){
@@ -151,6 +158,10 @@ main (int argc, char **argv)output_error=output_error_warn_nopipe;break;+case'q':+quiet=true;+break;+case_GETOPT_HELP_CHAR;case_GETOPT_VERSION_CHAR(PROGRAM_NAME,AUTHORS);
@@ -235,8 +246,9 @@ tee_files (int nfiles, char **files)break;/* Write to all NFILES + 1 descriptors.-Standardoutputisthefirstone.*/-for(i=0;i<=nfiles;i++)+Standardoutputisthefirstone.+If'quiet'istrue,writetodescriptors1andabove(omitstdout)*/+for(i=quiet;i<=nfiles;i++)if(descriptors[i]&&fwrite(buffer,bytes_read,1,descriptors[i])!=1){
--
2.30.0
_______________________________________________
freebsd-hackers@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@freebsd.org"
Hi,
Why is this a thing?
The point of tee is to write a file *and* to stdout. If you don't want use that, use:
`> file`
To overwrite.
Or
`>> file`
To append.
I guess the only reason this would be used is if you wanted to write
multiple files at the same time, which tee supports.
-Teran
From: Otto Moerbeek <hidden> Date: 2021-01-24 17:59:41
On Sun, Jan 24, 2021 at 01:18:46PM +0100, Alejandro Colomar wrote:
This is useful for using tee to just write to a file,
at the end of a pipeline,
without having to redirect to /dev/null
Example:
echo 'foo' | sudo tee -q /etc/foo;
is equivalent to the old (and ugly)
You keep repeating "ugly" as the reason you are wanting this.
I consider adding special options to command to solve an imagined
issue that can be solved with a general concept like redirection ugly.
Please stop pushing your diff to this list. So far nobody showed any
interest.
-Otto
quoted hunk
echo 'foo' | sudo tee /etc/foo >/dev/null;
Signed-off-by: Alejandro Colomar <redacted>
---
Resend as v3. I forgot to change the subject line.
Everything else is the same as in
[off-list ref].
src/tee.c | 18 +++++++++++++++---
1 file changed, 15 insertions(+), 3 deletions(-)
@@ -93,6 +98,7 @@ Copy standard input to each FILE, and also to standard output.\n\"), stdout);fputs(_("\-pdiagnoseerrorswritingtononpipes\n\+-q,--quiet,--silentdon'twritetostandardoutput\n\--output-error[=MODE]setbehavioronwriteerror.SeeMODEbelow\n\"), stdout);fputs(HELP_OPTION_DESCRIPTION,stdout);
@@ -130,8 +136,9 @@ main (int argc, char **argv)append=false;ignore_interrupts=false;+quiet=false;-while((optc=getopt_long(argc,argv,"aip",long_options,NULL))!=-1)+while((optc=getopt_long(argc,argv,"aipq",long_options,NULL))!=-1){switch(optc){
@@ -151,6 +158,10 @@ main (int argc, char **argv)output_error=output_error_warn_nopipe;break;+case'q':+quiet=true;+break;+case_GETOPT_HELP_CHAR;case_GETOPT_VERSION_CHAR(PROGRAM_NAME,AUTHORS);
@@ -235,8 +246,9 @@ tee_files (int nfiles, char **files)break;/* Write to all NFILES + 1 descriptors.-Standardoutputisthefirstone.*/-for(i=0;i<=nfiles;i++)+Standardoutputisthefirstone.+If'quiet'istrue,writetodescriptors1andabove(omitstdout)*/+for(i=quiet;i<=nfiles;i++)if(descriptors[i]&&fwrite(buffer,bytes_read,1,descriptors[i])!=1){
From: Theo de Raadt <hidden> Date: 2021-01-24 18:06:06
Otto Moerbeek [off-list ref] wrote:
On Sun, Jan 24, 2021 at 01:18:46PM +0100, Alejandro Colomar wrote:
quoted
This is useful for using tee to just write to a file,
at the end of a pipeline,
without having to redirect to /dev/null
Example:
echo 'foo' | sudo tee -q /etc/foo;
is equivalent to the old (and ugly)
You keep repeating "ugly" as the reason you are wanting this.
I consider adding special options to command to solve an imagined
issue that can be solved with a general concept like redirection ugly.
Please stop pushing your diff to this list. So far nobody showed any
interest.
I also see ZERO reason for this change.
This change will encourage the creation of non-portable scripts, which
harms backwards compatibility and portability, while increasing the
cognitive cost of building software in a simple and useable command
ecosystem.
From: Bernhard Voelker <hidden> Date: 2021-01-25 04:07:39
On 1/24/21 9:01 PM, Alex Henrie wrote:
I am definitely interested. Bernhard Voelker seemed to express
interest as well, conditional on -q being added to POSIX first.[1]
Just to clarify: I'm not as enthusiastic to add that option as it
may have sounded.
Let me put it like this: if -q once gets standardized by POSIX,
then we'd take it over in the GNU tee implementation.
Let me summarize so far:
The suggestion is to solve the problem to save some data coming from
a pipe as a different user.
There are at least those known solutions:
- use > or >> redirection.
- use dd(1)
I have the impression that a home for this feature was searched
in any tool, and as tee(1) already knew how to write to a file,
had the "append" feature, and is often used in pipes, it was
tempting to add it there.
But looking deeper, --quiet doesn't seem to fit well into 'tee'.
It even contradicts to the title line in the man page:
"read from standard input and write to standard output and files"
An off-tech argument: ask a local plumber if he'd would ever use
a tee piece instead of a pipe end piece. I guess he would only
if he wouldn't have anything else at hand.
A word to the proposed patch: what should happen, if the user does
not give a file?
A | B | tee -q
The patch just silently ignored that situation which feels wrong.
Therefore, adding a feature which does not really fit is wrong, and
contradicts the one-tool-for-one-purpose UNIX philosophy.
OTOH I understand that there's a little gap in the tool landscape.
Astonishingly, there doesn't seem to exist a trivial tool to redirect
from standard input (or any other input file descriptor) to a file.
I wrote such a little tool in the attached:
$ src/sink --help
Usage: src/sink [OPTION]... FILE
Copy input stream to FILE.
Mandatory arguments to long options are mandatory for short options too.
-a, --append append to the given FILE, do not overwrite
-c, --create ensure to create FILE, error if exists
-i, --input-stream=FD read from stream FD instead of standard input
The default input stream number FD is 0, representing the standard input.
This allows not only to copy data from standard input, but from any
file descriptor open for reading. It also allows control over
how the output file will be opened (e.g. with O_CREAT|E_EXCL).
The OPs case would look like:
echo 'foo' | sudo sink /etc/foo
or
echo 'foo' | sudo sink -a /etc/foo # append.
or
echo 'foo' | sudo sink -c /etc/foo # ensure creation of the file.
I'm not sure if this will ever be considered for inclusion -
I just did it "for fun". ;-)
Have a nice day,
Berny
This is useful for using tee to just write to a file,
at the end of a pipeline,
without having to redirect to /dev/null
Example:
echo 'foo' | sudo tee -q /etc/foo;
is equivalent to the old (and ugly)
echo 'foo' | sudo tee /etc/foo >/dev/null;
Why don't you just do
echo foo > /etc/foo
or
sudo sh -c 'echo foo > /etc/foo' ?
I don't normally use sudo, so there might be some better way of using it.
Kind regards,
Philipp
Hi Berny,
On 1/25/21 12:33 PM, Alejandro Colomar (man-pages) wrote:
On 1/25/21 5:03 AM, Bernhard Voelker wrote:
quoted
On 1/24/21 9:01 PM, Alex Henrie wrote:
quoted
I am definitely interested. Bernhard Voelker seemed to express
interest as well, conditional on -q being added to POSIX first.[1]
Just to clarify: I'm not as enthusiastic to add that option as it
may have sounded.
Let me put it like this: if -q once gets standardized by POSIX,
then we'd take it over in the GNU tee implementation.
Let me summarize so far:
The suggestion is to solve the problem to save some data coming from
a pipe as a different user.
There are at least those known solutions:
- use > or >> redirection.
- use dd(1)
I have the impression that a home for this feature was searched
in any tool, and as tee(1) already knew how to write to a file,
had the "append" feature, and is often used in pipes, it was
tempting to add it there.
But looking deeper, --quiet doesn't seem to fit well into 'tee'.
It even contradicts to the title line in the man page:
"read from standard input and write to standard output and files"
An off-tech argument: ask a local plumber if he'd would ever use
a tee piece instead of a pipe end piece. I guess he would only
if he wouldn't have anything else at hand.
I never knew what 'tee' meant. That makes sense now.
quoted
A word to the proposed patch: what should happen, if the user does
not give a file?
A | B | tee -q
The patch just silently ignored that situation which feels wrong.
Therefore, adding a feature which does not really fit is wrong, and
contradicts the one-tool-for-one-purpose UNIX philosophy.
Agreed.
quoted
OTOH I understand that there's a little gap in the tool landscape.
Astonishingly, there doesn't seem to exist a trivial tool to redirect
from standard input (or any other input file descriptor) to a file.
I wrote such a little tool in the attached:
$ src/sink --help
Usage: src/sink [OPTION]... FILE
Copy input stream to FILE.
Mandatory arguments to long options are mandatory for short options
too.
-a, --append append to the given FILE, do not overwrite
-c, --create ensure to create FILE, error if exists
-i, --input-stream=FD read from stream FD instead of standard
input
On second thought, this program does two things: read any FD, and write
to file. I think it should be limited to writing to a file from stdin.
If you think there's a need for reading FDs other than 0, you might as
well want to pipe that information you're reading from them to filter it
with another tool, and this program doesn't allow you to do that, as
it's a sink.
So, I would remove '-i, --input-stream'. (And if you think it's
missing, maybe write a program to read from any FD and write to stdout.)
Regards,
Alex
quoted
The default input stream number FD is 0, representing the standard
input.
This allows not only to copy data from standard input, but from any
file descriptor open for reading. It also allows control over
how the output file will be opened (e.g. with O_CREAT|E_EXCL).
The OPs case would look like:
echo 'foo' | sudo sink /etc/foo
or
echo 'foo' | sudo sink -a /etc/foo # append.
or
echo 'foo' | sudo sink -c /etc/foo # ensure creation of the file.
I'm not sure if this will ever be considered for inclusion -
I just did it "for fun". ;-)
Tested-by: Alejandro Colomar <redacted>
Reviewed-by: Alejandro Colomar <redacted>
Much better than my patch. :-)
I am definitely interested. Bernhard Voelker seemed to express
interest as well, conditional on -q being added to POSIX first.[1]
Just to clarify: I'm not as enthusiastic to add that option as it
may have sounded.
Let me put it like this: if -q once gets standardized by POSIX,
then we'd take it over in the GNU tee implementation.
Let me summarize so far:
The suggestion is to solve the problem to save some data coming from
a pipe as a different user.
There are at least those known solutions:
- use > or >> redirection.
- use dd(1)
I have the impression that a home for this feature was searched
in any tool, and as tee(1) already knew how to write to a file,
had the "append" feature, and is often used in pipes, it was
tempting to add it there.
But looking deeper, --quiet doesn't seem to fit well into 'tee'.
It even contradicts to the title line in the man page:
"read from standard input and write to standard output and files"
An off-tech argument: ask a local plumber if he'd would ever use
a tee piece instead of a pipe end piece. I guess he would only
if he wouldn't have anything else at hand.
I never knew what 'tee' meant. That makes sense now.
A word to the proposed patch: what should happen, if the user does
not give a file?
A | B | tee -q
The patch just silently ignored that situation which feels wrong.
Therefore, adding a feature which does not really fit is wrong, and
contradicts the one-tool-for-one-purpose UNIX philosophy.
Agreed.
OTOH I understand that there's a little gap in the tool landscape.
Astonishingly, there doesn't seem to exist a trivial tool to redirect
from standard input (or any other input file descriptor) to a file.
I wrote such a little tool in the attached:
$ src/sink --help
Usage: src/sink [OPTION]... FILE
Copy input stream to FILE.
Mandatory arguments to long options are mandatory for short options too.
-a, --append append to the given FILE, do not overwrite
-c, --create ensure to create FILE, error if exists
-i, --input-stream=FD read from stream FD instead of standard input
The default input stream number FD is 0, representing the standard input.
This allows not only to copy data from standard input, but from any
file descriptor open for reading. It also allows control over
how the output file will be opened (e.g. with O_CREAT|E_EXCL).
The OPs case would look like:
echo 'foo' | sudo sink /etc/foo
or
echo 'foo' | sudo sink -a /etc/foo # append.
or
echo 'foo' | sudo sink -c /etc/foo # ensure creation of the file.
I'm not sure if this will ever be considered for inclusion -
I just did it "for fun". ;-)
Tested-by: Alejandro Colomar <redacted>
Reviewed-by: Alejandro Colomar <redacted>
Much better than my patch. :-)
From: Alex Henrie <hidden> Date: 2021-01-27 04:59:58
On Sun, Jan 24, 2021 at 9:04 PM Bernhard Voelker
[off-list ref] wrote:
An off-tech argument: ask a local plumber if he'd would ever use
a tee piece instead of a pipe end piece. I guess he would only
if he wouldn't have anything else at hand.
According to POSIX, tee writes to "zero or more files."[1] So the
"local plumber" analogy already doesn't hold, because a plumber would
never put in a tee and then immediately cap it off so that the flow
can only go to one place, but commands like `echo foo | tee | tee |
tee` are already explicitly allowed.
A word to the proposed patch: what should happen, if the user does
not give a file?
A | B | tee -q
The patch just silently ignored that situation which feels wrong.
OTOH I understand that there's a little gap in the tool landscape.
Astonishingly, there doesn't seem to exist a trivial tool to redirect
from standard input (or any other input file descriptor) to a file.
I wrote such a little tool in the attached:
$ src/sink --help
Usage: src/sink [OPTION]... FILE
Copy input stream to FILE.
Mandatory arguments to long options are mandatory for short options too.
-a, --append append to the given FILE, do not overwrite
-c, --create ensure to create FILE, error if exists
-i, --input-stream=FD read from stream FD instead of standard input
The default input stream number FD is 0, representing the standard input.
This allows not only to copy data from standard input, but from any
file descriptor open for reading. It also allows control over
how the output file will be opened (e.g. with O_CREAT|E_EXCL).
The OPs case would look like:
echo 'foo' | sudo sink /etc/foo
or
echo 'foo' | sudo sink -a /etc/foo # append.
or
echo 'foo' | sudo sink -c /etc/foo # ensure creation of the file.
I'm not sure if this will ever be considered for inclusion -
I just did it "for fun". ;-)
Have a nice day,
Berny
From: Alex Henrie <hidden> Date: 2021-03-15 17:52:51
On Sun, Mar 14, 2021 at 3:44 AM Alejandro Colomar (man-pages)
[off-list ref] wrote:
On 1/25/21 5:03 AM, Bernhard Voelker wrote:
quoted
OTOH I understand that there's a little gap in the tool landscape.
Astonishingly, there doesn't seem to exist a trivial tool to redirect
from standard input (or any other input file descriptor) to a file.
I wrote such a little tool in the attached:
$ src/sink --help
Usage: src/sink [OPTION]... FILE
Copy input stream to FILE.
Mandatory arguments to long options are mandatory for short options too.
-a, --append append to the given FILE, do not overwrite
-c, --create ensure to create FILE, error if exists
-i, --input-stream=FD read from stream FD instead of standard input
The default input stream number FD is 0, representing the standard input.
This allows not only to copy data from standard input, but from any
file descriptor open for reading. It also allows control over
how the output file will be opened (e.g. with O_CREAT|E_EXCL).
The OPs case would look like:
echo 'foo' | sudo sink /etc/foo
or
echo 'foo' | sudo sink -a /etc/foo # append.
or
echo 'foo' | sudo sink -c /etc/foo # ensure creation of the file.
I'm not sure if this will ever be considered for inclusion -
I just did it "for fun". ;-)
Have a nice day,
Berny
By chance, I just found out that there is a tool very similar to 'sink'
in moreutils [1]. It's called 'sponge'.
[1]: <https://joeyh.name/code/moreutils/>
So this feature already exists, and therefore I drop my patches.
Cheers,
Alex
Interesting, thanks for sharing. There's still no `sponge -q` option
though--it always writes either to a file or to standard output.
-Alex
From: Alex Henrie <hidden> Date: 2021-03-15 20:21:49
On Mon, Mar 15, 2021 at 11:42 AM Alex Henrie [off-list ref] wrote:
On Sun, Mar 14, 2021 at 3:44 AM Alejandro Colomar (man-pages)
[off-list ref] wrote:
quoted
On 1/25/21 5:03 AM, Bernhard Voelker wrote:
quoted
OTOH I understand that there's a little gap in the tool landscape.
Astonishingly, there doesn't seem to exist a trivial tool to redirect
from standard input (or any other input file descriptor) to a file.
I wrote such a little tool in the attached:
$ src/sink --help
Usage: src/sink [OPTION]... FILE
Copy input stream to FILE.
Mandatory arguments to long options are mandatory for short options too.
-a, --append append to the given FILE, do not overwrite
-c, --create ensure to create FILE, error if exists
-i, --input-stream=FD read from stream FD instead of standard input
The default input stream number FD is 0, representing the standard input.
This allows not only to copy data from standard input, but from any
file descriptor open for reading. It also allows control over
how the output file will be opened (e.g. with O_CREAT|E_EXCL).
The OPs case would look like:
echo 'foo' | sudo sink /etc/foo
or
echo 'foo' | sudo sink -a /etc/foo # append.
or
echo 'foo' | sudo sink -c /etc/foo # ensure creation of the file.
I'm not sure if this will ever be considered for inclusion -
I just did it "for fun". ;-)
Have a nice day,
Berny
By chance, I just found out that there is a tool very similar to 'sink'
in moreutils [1]. It's called 'sponge'.
[1]: <https://joeyh.name/code/moreutils/>
So this feature already exists, and therefore I drop my patches.
Cheers,
Alex
Interesting, thanks for sharing. There's still no `sponge -q` option
though--it always writes either to a file or to standard output.
-Alex
Actually, it looks like `pee` (also from moreutils) can be used for
throwing input into the void. So between `sponge` and `pee`, I think
all the use cases are covered!
-Alex