Hacker News new | past | comments | ask | show | jobs | submit login
The Origin of Unix Pipes (cat-v.org)
133 points by mrleinad on March 1, 2011 | hide | past | favorite | 25 comments

In my very first job interview I was asked to explain Unix pipes and I used the analogy of garden hoses - only to be told that was a stupid way of explaining them!

I'd say they're more like a series of tubes.

I guess you're happy they did not hire you, right?

I did get the job :-)


It is truly amazing just how much of what we use, from big ideas to little ones, was invented in the 1960s.

Invention brings the idea to life. Innovation brings the ideas to market.

One should forward this document to microsoft.

According to Wikipedia the UNIX-Pipes came along in the 70s. This document however seems to refer to something called DTSS. http://en.wikipedia.org/wiki/Pipe_(Unix)#History

Wow - I actually added that entry about DTSS a few years after my father (Ken Lochner) died. It's kind of a trip to now read it on HN.

> Assert(Ken Lochner(DTSS) != Doug McIlroy(|))


I asked this previously on SO - http://stackoverflow.com/questions/3121385/is-it-possible-to...

What is the difference between OSX services and Unix pipes ? Could something like OSX services be built trivially on Linux ?

As the commenter on your SO post has mentioned, they are not actually the same thing. Pipes are a much lower level concept than these OSX services. Of course you could implement them on linux, and you might even want to use pipes to do it, but its not a terribly interesting problem. Really its just GUI design, not a unix thing at all.

Maybe my question was framed wrong.

If I ask about how a OSX-like services framework may be created, what is the answer ? For example, there are OSX services that remove spaces from text or even summarize paragraphs. IMHO, some of them are contextual - some services only show up as active when you copy a URL, etc.

They seem pretty nifty and I always wondered why Linux doesnt have something like this.

Unix pipes are just unnamed FIFOs, that's it. You are free to implement "OSX Services" in linux if you want, and you could use unnamed FIFOs in your implementation, but they are unrelated concepts. You could also implement the idea with any other form of IPC, it hardly matters.

Furthermore, Linux doesn't have them because, unlike pipes, this isn't a feature that should be provided by kernels. If you wanted to add them to Gnome or KDE, I'm sure you could with minimal trouble.

I think you will find something very similar in Plan9 land - lookup plumber http://doc.cat-v.org/plan_9/4th_edition/papers/plumb. Since plan9 from userspace is available under linux, it may be possible to do something with it.

You keep asking the same question repeatedly, hoping that some magic combination of words will lead to a different answer.


UNIX pipes are only a tiny bit like OS X Services from a user's perspective. They are nothing alike from a program's perspective.

As others have said, UNIX pipes simply connect one program's standard output to another program's standard input. That's all. It uses the exact same mechanism that would otherwise show information to you and accept input from you.

OS X Services are a completely different, proprietary thing. It works via the 'Pasteboard' which is rather like a secondary clipboard. Apple created a specific interface which must be recognized by a program in order to supply OS X Services with data. This interface is wholly unrelated to the rest of the program's interfaces.

OS X Services are much more akin to something that you would build on Windows using COM, like a Windows Explorer Shell Extension.

If you wanted to recreate OS X Services on Linux, you would have to define some sort of new interface for exchanging data between applications, then convince developers around the world to add the new API into their programs.


FYI - My question changed from the similarity of pipes and services to just thinking about how something like services could be implemented on Linux. I did take a look at GnuStep Services, but is it the way someone would have done, if starting from a clean slate ? Powershell has a "pipeline" as well which works at object level. Again, it may not be the same thing as pipes or services implementation-wise, but it is conceptually relevant.

Glad they chose 'pipe' over 'hose'.

To "massage data" sounds a bit like what some scientists do whenever they don't get the results they expect.

Kinda funny concept anyway...

You've attributed one connotation (probably the one most known to public due to media reporting of scientist malfeasance) to the phrase "massage data". Which actually has the more general meaning of to manipulate, to process data. Perhaps to get the data into different format, or to extract just the rows/columns/bits that are of interest.

A drawback of English not being my native language, most probably. :) Thanks for your clarification.

Maybe some folks here with a better understanding of pipes than myself can help me figure out how to do the following using pipes and not a temporary file. I need a minimalist method to format a couple of email headers, append an email body, then send that email with `msmtp`. This is all running on a small embedded linux system with some additional packages bolted on. This will be mailing the status updates from my backup server to myself. Partly I'm doing this because I don't want to run a full-blown mail user agent, and partly I'm just curious how concise it can be :)

The requirement is that this be an executable script which can take any number of command-line arguments describing email headers, and which receives the body of an email on STDIN. I think this can all be done via pipes but I'm not entirely sure how - the trick is that the output of the program over STDOUT needs to be the concatenation of formatted command-line arguments plus the contents of STDIN. I had difficulty figuring out how to have two different commands both send output, in order, to the STDIN of `msmtp -t`. msmtp is configured to send email via a Google Apps account.

Here's what I'm using at the moment. It works but I think it could be more elegant and UNIXY without the temporary file.

  T=`/opt/bin/mktemp`                         # create a temporary file
  echo -e "From:$1\nTo:$2\nSubject:$3\n" > $T # format command-line args into the file
  cat <&0 >>$T                                # append STDIN to the file
  msmtp -t <$T                                # mail the file (-t parses the smtp recipient from the email headers)
  rm $T                                       # delete the file

  # used as follows:
  #/usr/local/bin/minimail "sender@example.com" "recipient@example.com" "Subject of the Email" <body.txt
Any ideas?

But yeah, stackoverflow.com

That works perfectly. Thank you.

Sorry for the noise.

Applications are open for YC Summer 2021

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact