Hacker News new | past | comments | ask | show | jobs | submit login
A Unix Shell poster from 1983 (twitter.com/0xuid)
74 points by skellertor on Oct 15, 2018 | hide | past | favorite | 31 comments

>@ kill line

I think I saw this in _The Unix Programming Environment_ by Kernighan and Pike. @ doesn't seem to do anything using various shells on any systems I can quickly think of trying:

* /bin/sh (dash) on Linux on AMD64

* zsh on Linux on AMD64, NetBSD/amd64 (Xen domU), NetBSD/sparc64, Solaris 10 on Sparc64

* bash on Linux on AMD64

* /bin/sh on NetBSD/amd64 (Xen domU), NetBSD/sparc64, Solaris 10 on Sparc64, Tru64 V5.1 2650 on Alpha

* pdksh on OpenBSD on AMD64

None of those seemed to treat @ as anything special so I decided to go older, but…

* /bin/csh and /bin/sh on 4.3BSD on simh-vax780

…equally bust. Maybe I'm remembering the syntax wrong? I don't have the book with me now. Otherwise, wonder when this feature was removed? Probably after video terminals with erasable characters became commonplace.

It's from the System V Interface Definition standard. See page 625 in http://www.sco.com/developers/devspecs/vol1a.pdf

> During input, erase and kill processing is normally done. The ERASE character (by default, the # character) erases the last character typed. The WERASE character (CRTL-W) erases the last ‘‘word’’ typed in the current input line (but not any preceding spaces or tabs). A ‘‘word’’ is defined as a sequence of non-blank characters, with tabs counted as blanks. Neither ERASE nor WERASE will erase beyond the beginning of the line. The KILL character (by default, the @ character) kills (deletes) the entire input line, and optionally outputs a newline character. All these characters operate on a key stroke basis, independent of any backspacing or tabbing that may have been done. The REPRINT character (CTRL-R) prints a newline followed by all characters that have not been read. Reprinting also occurs automatically if characters that would normally be erased from the screen are fouled by program output. The characters are reprinted as if they were being echoed; consequencely, if ECHO is not set, they are not printed.

@ was actually the try driver's default kill character through 7th Edition or thereabouts. It was changed to ^U when CRT terminals became common, since those could actually erase the input, and there was no need to leave a visible marker showing killed text.

I think the erasing behavior came from 2BSD. That's where I saw it first in Unix.

Yep, I assume the change was due to change from paper teletypes to CRT terminals. 2BSD is interesting, because that would make this likely a V7/SysIII/SysV poster since in 1983 they were already releasing 4.2BSD. The Unix Programming Environment was released in 1984 so that part might have confused BSD users already back when it was released! I wouldn't be surprised if AT&T continued with @ and # all the way to SVR4.

The @ character did kill a line back in the days where you typed your commands on a TTY -- that is a real TTY that printed your commands on a roll of paper. On a modern Unix you would use control-U.

I'm fairly sure that '@' is a character that's wandered around keyboards and character sets over the years - could it be that the command is a different character these days?

This character is configurable with 'stty' and the 'termcap' system. If you do "stty -a" it will tell you what the kill character is - usually ^U.

I suspect the default got changed round about the time '@' became used in email addresses.

Here is a larger version that isn't a photo: https://i.imgur.com/iicvkdp.png

I was expecting this one instead:


So the "improper" use of cat, for printing files on screen, dates back to at least 1983. I consider it legitimized.

I never liked this "improper" moniker.

If you're writing a quick script it's way more convenient and readable to just put the input where you'd expect it, at the start of the pipeline, as its own thing. It's a bit more inefficient, but you don't go mucking around with file input parameters for the commands later on in the pipeline, especially as you're moving them around and changing them.

Cat is fine for reading a file. It’s when you ‘cat <file> | grep <word>‘ that it becomes improper use.

TeMPOraL got the adjective wrong. The correct adjective is "useless".

* http://porkmail.org/era/unix/award.html

I would buy a reproduction in a heartbeat.

Funny seeing this pop up as I've spent this whole weekend working on a Rust POSIX shell: https://github.com/nixpulvis/oursh.

`&` is my next thing to implement.

The challenge here is to identify the 1983 Unix, or whether it is indeed one single Unix.

It has the old line discipline defaults for the eof, kill, and interrupt special characters. But it also has a job control shell and the susp special character. It does not mention either Mail or mailx. login is apparently the shell built in that overlays the current shell, and there are both vi and ex for the visual and line mode editors. But there's a help command, too.

So, in 1983 I think the possible variants are 4.2BSD, SunOS 1.0, Xenix 3.0, SVR1.

Someone in a sibling thread mentioned the kill line characters were already replaced around 2BSD. SVR1 had vi and ex, too. `lpr` is BSDian, I think, but maybe System V included that too as an alternative.

It's hard to tell, really. At the time SVR1 was out and included fairly many bits of BSD in it, as did Xenix. The only thing I can really say is that SunOS is unlikely, since it was designed for workstations with video monitors from day 1 and the kill characters seem anachronistic since erasing was a standard feature in terminals already and default behavior in current BSD.

Interesting that `pr` and `troff` still exists on OS X Mojave!

`pr` is part of the POSIX standard, so of course it still hangs around! Can't remove a thing like that! I don't think `troff` is part of POSIX, but since it used to be (still is?) the standard tool for typesetting man pages, it's not so surprising it's still around.

Man pages are typeset with nroff to the console and troff to the printer. Yes, you can print manpages, and they turn out quite nice: try "man -t bash > bash.ps" to produce a postscript file which can be printed or converted to PDF etc.

Okay. You kind of blew my mind. My `man` command doesn't seem to have the `-t` switch, but I can do this

    MANPAGER=mupdf man -T pdf man
and, bam! I'm reading a pdf man page for `man`. On my system `man` is symlinked to `mandoc` and I've apparently got the latest version from here:


Better yet, the `-T` switch seems to take a decent selection of options, even markdown and html!

pr is part of SUS, which macOS must implement to remain called "Unix".

In the comments on Twitter someone said "This inspired Debian". What's that story about?

There's a question mark. Seems like pure speculation.

Probably Debian's logo

The Debian logo is based on the idea of magic smoke, not this.

There was a contest to design the Debian logo and people voted. I remember participating in that contest and remember when the winner was announced, but I don't remember anything about this poster.

Was Fortran called F77 back then?

F77 is the 1977 revision of Fortran standard, which brought major new features.

No the language was called FORTRAN back then, and the executable compiler was f77

Where is "yes"?

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