You actually have two questions here.
- Why it prints
stdin: is not a tty
?
This warning message is printed by bash -l
. The -l
(--login
) options asks bash
to start the login shell, e.g. the one which is usually started when you enter your password. In this case bash
expects its stdin
to be a real terminal (e.g. the isatty(0)
call should return 1), and it's not true if it is run by cron
—hence this warning.
Another easy way to reproduce this warning, and the very common one, is to run this command via ssh
:
$ ssh [email protected] 'bash -l -c "echo test"'
Password:
stdin: is not a tty
test
It happens because ssh
does not allocate a terminal when called with a command as a parameter (one should use -t
option for ssh
to force the terminal allocation in this case).
- Why it did not work without
-l
?
As correctly stated by @Cyrus in the comments, the list of files which bash
loads on start depends on the type of the session. E.g. for login shells it will load /etc/profile
, ~/.bash_profile
, ~/.bash_login
, and ~/.profile
(see INVOCATION in manual bash(1)
), while for non-login shells it will only load ~/.bashrc
. It seems you defined your http_proxy
variable only in one of the files loaded for login shells, but not in ~/.bashrc
. You moved it to ~/.wgetrc
and it's correct, but you could also define it in ~/.bashrc
and it would have worked.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…