# $stdin

**URL:** <https://www.ruby-forum.com/t/stdin/132766>\
**Category:** Ruby\
**Created:** [March 24, 2008, 3:53pm UTC](https://www.ruby-forum.com/t/stdin/132766 "2008-03-24T15:53:05Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![Stefan\_Gremm](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/6a8cbe/32.png) [@Stefan\_Gremm](https://www.ruby-forum.com/u/Stefan_Gremm)\
**Post date:** [March 24, 2008, 3:53pm UTC](https://www.ruby-forum.com/t/stdin/132766/1 "2008-03-24T15:53:05Z")

</div>

Hello,

first excuse me my bad english.

i have write a little send\_mail script. now i pipe the messagetext from  
another program, like cat /var/mailtext| send-mail.rb

the program source:

smtp\_message = “”

temp = $stdin

temp.each do |f|  
smtp\_message += f  
end

this is runing very well, but when no text is in the pipe, the program  
is waiting for input.

my question is, how can i ask, if text in $stdin, without the program is  
waitung for input.

ciao

Stefan

---

<div class="post-metadata">

**Author:** ![Stefan\_Gremm](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/6a8cbe/32.png) [@Stefan\_Gremm](https://www.ruby-forum.com/u/Stefan_Gremm)\
**Post date:** [March 24, 2008, 6:11pm UTC](https://www.ruby-forum.com/t/stdin/132766/2 "2008-03-24T18:11:33Z")

</div>

Stefan Gremm wrote:

> Hello,
> 
> first excuse me my bad english.
> 
> i have write a little send\_mail script. now i pipe the messagetext from  
> another program, like cat /var/mailtext| send-mail.rb
> 
> the program source:
> 
> smtp\_message = “”
> 
> temp = $stdin
> 
> temp.each do |f|  
> smtp\_message += f  
> end
> 
> this is runing very well, but when no text is in the pipe, the program  
> is waiting for input.
> 
> my question is, how can i ask, if text in $stdin, without the program is  
> waitung for input.
> 
> ciao
> 
> Stefan

Try the -n option

> -n assume ‘while gets(); … end’ loop around your  
> script

#code  
smtp\_message = “”  
$\_.each do |f|  
smtp\_message += f  
end  
#endcode

cat /var/mailtext| ruby -n send-mail.rb

-rb

---

<div class="post-metadata">

**Author:** ![Stefan\_Gremm](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/6a8cbe/32.png) [@Stefan\_Gremm](https://www.ruby-forum.com/u/Stefan_Gremm)\
**Post date:** [March 24, 2008, 6:48pm UTC](https://www.ruby-forum.com/t/stdin/132766/3 "2008-03-24T18:48:09Z")

</div>

Am Dienstag, den 25.03.2008, 02:11 +0900 schrieb Rodrigo B.:

> #endcode
> 
> cat /var/mailtext| ruby -n send-mail.rb

thanks for the answer, but when i start my script is coming the folowing  
error

undefined method `each’ for nil:NilClass (NoMethodError)

and my command parser brings failure

ciao

Stefan

---

<div class="post-metadata">

**Author:** ![Stefan\_Gremm](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/6a8cbe/32.png) [@Stefan\_Gremm](https://www.ruby-forum.com/u/Stefan_Gremm)\
**Post date:** [March 24, 2008, 7:19pm UTC](https://www.ruby-forum.com/t/stdin/132766/4 "2008-03-24T19:19:17Z")

</div>

Am Dienstag, den 25.03.2008, 03:12 +0900 schrieb Rodrigo B.:

> did you change ?:
> 
> > temp.each do |f|  
> > with  
> > $\_.each do |f|  
> > –

yes, now i have  
$stdin.each do |f| unless $stdin == nil  
smtp\_message += f  
end  
end

but when i have nothing in $stdin, the program is waiting

Ciao

Stefan

---

<div class="post-metadata">

**Author:** ![Stefan\_Gremm](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/6a8cbe/32.png) [@Stefan\_Gremm](https://www.ruby-forum.com/u/Stefan_Gremm)\
**Post date:** [March 24, 2008, 7:12pm UTC](https://www.ruby-forum.com/t/stdin/132766/5 "2008-03-24T19:12:11Z")

</div>

Stefan Gremm wrote:

> Am Dienstag, den 25.03.2008, 02:11 +0900 schrieb Rodrigo B.:
> 
> > #endcode
> > 
> > cat /var/mailtext| ruby -n send-mail.rb
> 
> thanks for the answer, but when i start my script is coming the folowing  
> error
> 
> undefined method `each’ for nil:NilClass (NoMethodError)
> 
> and my command parser brings failure
> 
> ciao
> 
> Stefan

did you change ?:

> temp.each do |f|  
> with  
> $\_.each do |f|

---

<div class="post-metadata">

**Author:** ![Stefan\_Gremm](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/6a8cbe/32.png) [@Stefan\_Gremm](https://www.ruby-forum.com/u/Stefan_Gremm)\
**Post date:** [March 24, 2008, 9:45pm UTC](https://www.ruby-forum.com/t/stdin/132766/6 "2008-03-24T21:45:06Z")

</div>

weird it is working for me…

> touch 1  
> #create empty file

> cat 1| 2.rb  
> : undefined method `each’ for nil:NilClass (NoMethodError)

> cat 1| ruby -n 2.rb  
> #No errors

You need to specify the -n option.

#############

> cat 2.rb  
> smtp\_message = “”

$\_.each do |f|  
smtp\_message += f  
end  
p smtp\_message

---

<div class="post-metadata">

**Author:** ![Stefan\_Gremm](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/6a8cbe/32.png) [@Stefan\_Gremm](https://www.ruby-forum.com/u/Stefan_Gremm)\
**Post date:** [March 25, 2008, 9:44am UTC](https://www.ruby-forum.com/t/stdin/132766/7 "2008-03-25T09:44:11Z")

</div>

Am Dienstag, den 25.03.2008, 08:50 +0900 schrieb Eric H.:

> Here’s one way, but it isn’t foolproof.
> 
> $ ruby -e ‘p $stdin.tty?’  
> true  
> $ ruby -e ‘p $stdin.tty?’ \< /dev/null  
> false  
> $ cat /dev/null | ruby -e ‘p $stdin.tty?’  
> false

eric, thank you for your answer.

But, when starting the program without pipe, the result is true too

Mhmm, my program becoms the messagetext over pipe or over  
commandparameter ,if over pipe, all is good, if over parameter, the  
program hangs.

Ciao

Stefan

---

<div class="post-metadata">

**Author:** ![Stefan\_Gremm](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/6a8cbe/32.png) [@Stefan\_Gremm](https://www.ruby-forum.com/u/Stefan_Gremm)\
**Post date:** [March 25, 2008, 12:50am UTC](https://www.ruby-forum.com/t/stdin/132766/8 "2008-03-25T00:50:53Z")

</div>

On Mar 24, 2008, at 07:51 AM, Stefan Gremm wrote:

> my question is, how can i ask, if text in $stdin, without the  
> program is  
> waitung for input.

Here’s one way, but it isn’t foolproof.

$ ruby -e ‘p $stdin.tty?’  
true  
$ ruby -e ‘p $stdin.tty?’ \< /dev/null  
false  
$ cat /dev/null | ruby -e ‘p $stdin.tty?’  
false
