[HN Gopher] Write a Shell in C (2015)
       ___________________________________________________________________
        
       Write a Shell in C (2015)
        
       Author : sebg
       Score  : 191 points
       Date   : 2024-12-26 19:53 UTC (1 days ago)
        
 (HTM) web link (brennan.io)
 (TXT) w3m dump (brennan.io)
        
       | leonheld wrote:
       | Honestly this was one of the most influential pieces of writing
       | I've ever read. Back in the day this opened up a lot of the
       | implementation details on interpreters and C for me. It quite
       | literally helped "get" how programs are designed and written.
       | 
       | I found this piece around eighth grade and I'm very glad I did!
       | :-)
        
         | jamal-kumar wrote:
         | I saw a similar small shell in C as a tutorial but it was from
         | a book made in the 1980s on unix programming. Been wondering
         | what that book was ever since because it was just something
         | sitting around at a job that I didn't get to read all the way
         | through, but it really made things click finally
        
       | stefantalpalaru wrote:
       | The glibc manual has a section about writing a job control shell:
       | https://www.gnu.org/software/libc/manual/html_mono/libc.html...
        
       | dang wrote:
       | Related. Others?
       | 
       |  _Write a Shell in C_ -
       | https://news.ycombinator.com/item?id=26126010 - Feb 2021 (80
       | comments)
       | 
       |  _Write a Shell in C (2015)_ -
       | https://news.ycombinator.com/item?id=13112589 - Dec 2016 (68
       | comments)
       | 
       |  _Write a Shell in C_ -
       | https://news.ycombinator.com/item?id=8907392 - Jan 2015 (8
       | comments)
        
       | rtpg wrote:
       | For people who are interested in this stuff, I really recommend
       | just getting a copy of Advanced Programming in the UNIX
       | Environment and flipping through all (or most) of it. Pretty de-
       | mystifying (and a good argument for caring about what OS you
       | use!).
       | 
       | Then you can pick up some book on shells (Effective Linux at the
       | Command Line is one I'm going through right now), and you can
       | piece a lot of it together.
       | 
       | There's no magic, just a combo of decent ideas working together.
       | But no single idea is hard to implement. Maybe just hard to come
       | up with from scratch.
        
       | seafoamteal wrote:
       | I wrote a toy shell last summer and this was one of the pieces I
       | referred to most.
       | 
       | Writing the beginnings of a shell is surprisingly easy. fork()
       | and exec() do all the heavy lifting. I would recommend it as a
       | great systems programming exercise.
        
       | jkingsman wrote:
       | This was one of my favorite exercises in my introductory C
       | classes in college. I'm gratified to see other people with warm
       | and enlightened reactions to implementing something like this; it
       | was a monumental and eye-opening assignment for me and I couldn't
       | help but tinker with it for weeks. Many others saw it as just a
       | box ticking exercise with annoying string and OS munging, but it
       | felt like I had a secret of the universe laid bare for me in
       | seeing how to go from toy C programs to a useful shell that
       | accelerated some special purpose tasks.
        
         | neverartful wrote:
         | Can you elaborate on 'useful shell that accelerated some
         | special purpose tasks'? I'm curious about the types of things
         | that people have done with their own shells.
        
       | emmelaich wrote:
       | You might have a look the source for Advanced UNIX Programming by
       | Marc Rochkind, too.
       | 
       | In the book it starts literally with a one-shot shell - exec -
       | and moves onto fancier ones, including piping etc.
       | 
       | First version of source accompanying the book is at
       | https://github.com/gmarler/AUPv2/blob/master/c5/sh0.c and does
       | multiple commands.
        
       | rramadass wrote:
       | Very nice especially the pedagogy. A little bit of code (in a
       | top-down manner) together with the corresponding explanation for
       | a complete app is how things used to be explained in the old
       | days. I still remember studying Al Stevens' book _Turbo C: Memory
       | Resident Utilities, Screen I-O and Programming Techniques_ (for
       | DOS) and learning how to layer software viz. 1) a layer over
       | BIOS, 2) a layer to draw windows using (1) 3) a desktop manager
       | using (2) 4) a text editor 5) making the editor memory-resident.
       | Reading that book really taught me how to use C to build a non-
       | trivial app.
       | 
       | A very good Unix book with lots of projects like shell, token
       | ring etc. is _Practical UNIX Programming: A Guide to Concurrency,
       | Communication, and Multithreading_ by Kay Robbins and Steven
       | Robbins. It 's 2nd edition is named _UNIX Systems Programming:
       | Communication, Concurrency and Threads_. The code given in the
       | book is really illuminating.
        
       | khaki54 wrote:
       | I wrote a shell in C for Bruce Molay's Unix System Programming
       | class. I thought the hardest part was getting the globbing,
       | special characters, and escaping to work right. The other element
       | of Unix system programming in C (that some may not be aware of)
       | is that you are expected to make sure every line is 80 char or
       | less. At the end of the day, I was proud of what I accomplished,
       | but I think I only got a _C_ on the assignment.
        
       | ComputerGuru wrote:
       | Writing a shell in C is in some ways easier than writing a shell
       | in a higher language.
       | 
       | We just ported fish from C/C++ to rust and the amount of
       | semantically unsafe operations a shell does (eg passing around
       | file descriptors instead of a File object that can only have a
       | single mutable reference unless you want to place it in a lock)
       | and the onerous requirements of OS internals that require the use
       | of only async-safe methods in signal handlers and post-fork/pre-
       | exec (which is hard/impossible to do correctly if you're using
       | high-level wrappers) are quite something.
       | 
       | C is probably the ideal language for a _basic_ shell, which
       | should come as no surprise as OS and libc functionality to make
       | that happen was co-developed.
        
       | nedt wrote:
       | This so reminds me of the command line I've added to a little fun
       | tool I wrote in Borland C ~25 years ago. It was a strobe light
       | using your monitor and I wanted something to fine tune the
       | timings and color so I sat down a whole afternoon and added a
       | command line interface including line editing and history. So
       | much fun!
        
       | bssrdf wrote:
       | I would like to recommend "Understanding UNIX/LINUX Programming:
       | A Guide to Theory and Practice" for beginners.
       | 
       | You can download source code I assembled
       | https://github.com/bssrdf/UnderstandingUnixLinuxProgramming
        
       ___________________________________________________________________
       (page generated 2024-12-27 23:01 UTC)