I want to split stdout
so that it is printed both to stdout
and stderr
. This sounds like a job for tee
but the syntax is evading me -
./script.sh | tee stderr
Of course, how should stderr
actually be referred to here?
I want to split stdout
so that it is printed both to stdout
and stderr
. This sounds like a job for tee
but the syntax is evading me -
./script.sh | tee stderr
Of course, how should stderr
actually be referred to here?
./script.sh | tee /dev/fd/2
Note that this is dependant on OS support, not any built-in power in tee, so isn't universal (but will work on MacOS, Linux, Solaris, FreeBSD, probably others).
open()
). –
Duvalier bash
implies that it accepts /dev/fd/2
as a file name for file descriptor 2 even the file system doesn't have such a file. –
Harri bash
, so that isn't coming into play here. –
Duvalier tee
. –
Harri /dev/fd/2
exactly is. For example, if you log in as root
, your terminal is owned by root
. Then, if you switch user, you will have no permission to access /dev/fd/2
. –
Wirra /proc/self/fd/2
is something may be available. in fact, on my system [CentOS6] /dev/fd
is a symlink to /proc/self/fd
. –
Fulmis /dev/fd/2
or /proc/self/fd/2
or /dev/pts/xx
. for example: if su
to other user (then pts not belong to current uesr) –
Stickler The only cross platform method I found which works in both interactive and non-interactive shells is:
command | tee >(cat 1>&2)
The argument to tee is a file or file handle. Using process substitution we send the output to a process. In the process =cat=, we redirect stdout to stderr. The shell (bash/ksh) is responsible for setting up the 1 and 2 file descriptors.
#!/bin/bash
if it's run in a script. As sh
does not support >( xxxx )
–
Waites /dev/fd/2
or /proc/self/fd/2
not always exist and has write permission. –
Stickler ./script.sh | tee /dev/fd/2
Note that this is dependant on OS support, not any built-in power in tee, so isn't universal (but will work on MacOS, Linux, Solaris, FreeBSD, probably others).
open()
). –
Duvalier bash
implies that it accepts /dev/fd/2
as a file name for file descriptor 2 even the file system doesn't have such a file. –
Harri bash
, so that isn't coming into play here. –
Duvalier tee
. –
Harri /dev/fd/2
exactly is. For example, if you log in as root
, your terminal is owned by root
. Then, if you switch user, you will have no permission to access /dev/fd/2
. –
Wirra /proc/self/fd/2
is something may be available. in fact, on my system [CentOS6] /dev/fd
is a symlink to /proc/self/fd
. –
Fulmis /dev/fd/2
or /proc/self/fd/2
or /dev/pts/xx
. for example: if su
to other user (then pts not belong to current uesr) –
Stickler /dev/stderr
permissionuser not always has write permission for
for example, after sudo:
sudo su - nobody -s /bin/bash
nobody@test:/$ ls -lh /dev/stderr /dev/fd/2 /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Jun 10 2021 /dev/stderr -> /proc/self/fd/2
lrwx------ 1 nobody nogroup 64 Apr 7 01:58 /dev/fd/2 -> /dev/pts/5
lrwx------ 1 nobody nogroup 64 Apr 7 01:58 /proc/self/fd/2 -> /dev/pts/5
nobody@test:/$ echo hell >&2
hell
nobody@test:/$ echo hell >/dev/fd/2
-su: /dev/fd/2: Permission denied
nobody@test:/$ echo hell >/dev/stderr
-su: /dev/stderr: Permission denied
nobody@test:/$ echo hell > /dev/pts/5
-su: /dev/pts/5: Permission denied
awk
nobody@test:/$ echo hell | awk '{print>"/dev/stderr";print}'
hell
hell
nobody@test:/$ echo ' hell 12 ' | awk '{print|"cat 1>&2";print}'
hell 12
hell 12
Although there has >"/dev/stderr"
, but it not really same as it in shell.
Maybe awk
is not as performant as tee
,
But it's worth noting, about the real stderr
.
Figure out the difference
To be continue..
./script.sh 2>&1 >/dev/null | tee stderr.out
That opens STDERR to STDOUT, and then disposes of STDOUT.
/dev/null
. –
Tripterous © 2022 - 2024 — McMap. All rights reserved.
/dev/stderr
. I've not encountered a system with/dev/fd
that does not also have/dev/std{in,out,err}
, but that doesn't mean they don't exist. Mac OS X 10.7.5 has both; Solaris has both; Linux has both. AIX 6 has neither; HP-UX 11.00 has neither. – Stablemanbash
accepts/dev/stderr
as a synonym for standard error whether or not the file exists in the file system; it's a special case. – Harri/dev/fd/2
and/dev/stderr
; bash manual on redirections: Bash handles several filenames specially when they are used in redirections, ... – Timmytimocracy