From what I understand about program IO, there are stdin
, stdout
, and stderr
data streams (and a return code). stdout
and stderr
are the two data output streams. So if I use bash redirection to close one of the output streams, I can narrow down which stream that text is being sent to. Right?
I'm running Ubuntu 18.04.1 LTS and I'm running into this bizarre issue with bash redirection.
Let me explain the example. Here is my command:
# apt-cache show php5
N: Can't select versions from package 'php5' as it is purely virtual
N: No packages found
# |
The php5
package does not exist on Ubuntu 18.04 so apt-cache
displays an error. I would assume this text is sent to the stderr
stream, so I attempted to close that stream:
# apt-cache show php5 2>&-
# |
It appears this verifies that the text was sent through stderr
. All good so far! But now as a sanity check, I tried closing stdout
(I should see the error text now):
# apt-cache show php5 1>&-
# |
What!? I redirected stdout
this time but stderr
is also not showing up?
According to the internet, I have my file descriptors correct: https://www.gnu.org/software/bash/manual/html_node/Redirections.html
I can't figure out what could be going on here.
Screenshot proof:
apt-cache
seems to realize its output is being redirected. I get different output fromapt-cache show nonexistent
andapt-cache show nonexistent | cat
, for example. – wjandrea Oct 06 '18 at 03:04N:
lines get written to stdout andE:
lines go tostderr
, but whenstderr
is redirectedapt
hides both for whatever reason. Tracing the syscalls, however, shows that for some reasonwrite()
call for either line always goes to fd 2, though. – Sergiy Kolodyazhnyy Oct 06 '18 at 03:14