[HN Gopher] Twelve Days of Shell
___________________________________________________________________
Twelve Days of Shell
Author : zoidb
Score : 221 points
Date : 2025-12-08 10:13 UTC (12 hours ago)
(HTM) web link (12days.cmdchallenge.com)
(TXT) w3m dump (12days.cmdchallenge.com)
| Barathkanna wrote:
| Fun idea. It's basically an Advent calendar for shell one-liners.
| Nice way to level up your CLI muscles without diving into full
| projects.
| jll29 wrote:
| Neat.
|
| Perhaps it would be even nicer if the "advent" theme was more
| prominently present, e.g. using the Bible as the target data
| file to be used.
|
| Here's three examples tasks from me:
|
| (1) Write an sh script (using only POSIX standard commands) to
| create a Keywords in Context (KWIC) concordance of the new
| testament.
|
| (2) Write a bash script that uses grep with regular expressions
| to extracts all literal quotes of what Jesus said in the New
| Testament. [Incidentally, doing this task manually marked the
| beginnings of philology and later automating it marked the
| beginning of what was later called literary and linguistic
| computing, corpus linguistics, computational linguistics, and
| digital humanities.]
|
| (3) How many times is Jesus mentioned by each of the four
| accounts of his life (Matthew, Mark, Luke, and John)?
|
| (You may begin by extracting the New Testament from the end of
| the Bible with a grep command.)
|
| Dataset: https://openbible.com/textfiles/kjv.txt
| chrisweekly wrote:
| Respectfully, many would find that off-putting. "Advent of X"
| in tech is entirely decoupled from religion. Keeping it
| neutral seems to me the "nicest" approach. That said,
| something like what you described might be a cool exercise
| for your bible study group. Finally, I appreciated your
| "incidentally" aside about the origins of philology.
| lo_zamoyski wrote:
| I'll preface this by saying I was never especially bothered
| or moved by the non-religious use of "Advent of X", for
| better or for worse. In fact, my remark is inspired only by
| your comment, concerning its consistency and who has the
| stronger case.
|
| Specifically, while it is true that certain kinds of words
| can become decoupled from their original meanings (which is
| generally normal), in this case, the usage is not so
| decoupled, especially given that this usage occurs during
| the religious season of Advent and with the intentional
| allusion to the religious season of Advent. (Otherwise,
| what is "Advent of X" without its religious origin and
| which takes place at the exact same time during the year?)
|
| You can make a much stronger argument that the non-
| religious usage is a kind of cultural appropriation. That
| would make your concern entirely backwards. Your wish is to
| keep it "neutral" to please those who don't practice
| Advent, as you show a simultaneous lack of concern for the
| tradition it appropriates from. This involves a tacit claim
| of possessing the authority to do so as well, but if
| anything, given the source, if anything, the authority
| belongs not to the appropriators, but to the Church.
|
| One wonders how a "Ramadan of Code" or "Teshuvah of Shell"
| would be received.
|
| "Neutrality" is, of course, a bunk concept, and the idea
| that we ought to be guided by what is "nice" rather than
| what is "good" is a grave misunderstanding of how decisions
| ought to be made.
| arionmiles wrote:
| I've recently reached a point where I feel I've reached an upper
| limit with how much efficiency I can extract from my usual
| toolset/editors. So I've gone on a journey where I'm finally
| exploring tools that make living in the command line a productive
| and pleasant experience for me.
|
| I've long put off learning or even exploring tmux or learning
| more than a few handful of vim keybinds. So I started digging
| into configuring them and learning them well enough to be able to
| regularly use them for work and personal computers.
|
| It's been very pleasant, to say the least. There's still a few
| ways I need to go where I do everything from the command line and
| the keyboard, but I think it's worth training your muscles to be
| comfortable with doing things purely using the keyboard.
|
| I've switched to vim mode for a few tools that offer it. I
| started seriously using vimium on chrome and firefox (a friend
| had introduced me to it about 7 years ago but I never cared
| enough to learn it well).
|
| Another reason I finally made the jump was that I've been having
| RSI pain on my right hand due to using mouse too much and in un-
| ergonomic positions. While I've taken measures to improve
| ergonomic use of the mouse and keyboard, I'm just totally
| impressed with the capabilities of keyboard navigation and how
| much value you can extract out of your keyboard.
|
| My friends have been egging on me about the bell curve meme, but
| I think it's important for me to figure out the limits and then
| maybe I will finally go back to defaults and simpler tools. The
| only way to be on the right side of the bell curve is through the
| middle.
| kace91 wrote:
| I went back and forth over the years with vim. Lazyvim plus the
| ebook (lazyvim for ambitious devs or something like that, it's
| free online) is what allowed me to stick.
|
| I can't be doing real work and suddenly realize I don't know
| the way to do a certain basic action. Lazyvim makes it so that
| for everything you want to do, there's an already configured
| way, and then you have all the time in the world to fiddle for
| a better alternative if you don't like it.
| kalaksi wrote:
| For learning vim, I recommend searching for a "vim cheat sheet"
| that has an image of a keyboard layout with vim commands in it
| and printing that. Makes it easier to check and learn more,
| little by little.
|
| Another one is online tutorials that make you practice
| interactively. Haven't used those much but the little I did, it
| was helpful.
| johncoltrane wrote:
| Forget cheatsheets, tweets, videos, books, etc. Vim comes with
| a very well made built-in tutorial that will gently pull you
| toward maximum efficiency.
| arionmiles wrote:
| I love vim tutor!
|
| I learnt the basics of vim navigation through it. I'm yet to
| finish it since I dropped it after the first chapter to start
| using it as a daily driver and picking things as I need. I
| will probably come back and go through it again at some point
| and by then it will be another mind-blown situation
| sambaumann wrote:
| been using vim for years, just did the tutorial and learned
| several things I did not know
| ratrocket wrote:
| Not commenting on the larger gist of the comment, only:
|
| > I've been having RSI pain on my right hand due to using mouse
| too much and in un-ergonomic positions
|
| If you can, try using a left-hand vertical mouse. I use an
| Evoluent but there are a million brands. Get a cheapo and try
| it out. I figure it took me about a week to adjust and my
| wrists have been happier ever since.
| Izkata wrote:
| I have an odd suggestion for learning more of vim: Check out
| gvim.
|
| It's vim with a GUI, dropdowns for nice discoverability and
| most importantly the shortcuts on each menu item are the
| commands to use it in regular vim. It's how I found out vim
| even had folding waaay back.
|
| For Firefox, I use Tridactyl. After Vimperator died I tried
| several replacements and found Vimium very limited (IIRC it was
| the one that was just hotkeys and didn't have modes like vim,
| no idea how it's grown since then). I have Tridactyl configured
| to open gvim with the contents of any text input when I hit
| ctrl+i so I can use vim for them.
| arionmiles wrote:
| Vimium does have visual/caret/insert/command modes these
| days. Tridactyl does seem nice, I will check this out,
| thanks!
| probablyrobert wrote:
| Shameless shill - I found Tridactyl and Vimium to be
| frustratingly limited due to the security restrictions
| imposed on web extensions, so I've been working on
| https://glide-browser.app/ for a while; It's a fork of
| Firefox with (some) vim motions and a TypeScript based
| config.
| pstoll wrote:
| Neat idea a la regex golf.
|
| But doesn't seem to do enough shell escaping or correctly. Also
| seems underspecified, ie "find 5 lines starting with 'the"
| doesn't require a pipe to head -5.
| oneeyedpigeon wrote:
| > find 5 lines
|
| Especially since the previous two questions used head/tail.
| IMO, the wording would be better as "find all the lines" since
| that's what the command does.
| aargh_aargh wrote:
| The good: Nice exercises for beginners. Tab-completion, accepts
| readline characters like ctrl-u.
|
| The bad: You don't see the (wrong) output if you don't get it
| right the first time, making it hard to work iteratively and
| having to guess what the question actually intended.
|
| E.g. 'Seven files that start with "Santa"' actually wants _file
| names_ that start with Santa, after some questions that had you
| use "grep" to search _file contents_. Where I actually struggled
| with what 's expected is Day 11.
|
| The ugly: Actually a very nice design.
| Retr0id wrote:
| The tab completion sorta works but it seems to be simulated,
| doesn't understand subdirectories etc.
| pekim wrote:
| > Where I actually struggled with what's expected is Day 11.
|
| Just the lines from the files are wanted, not the files names.
| It took me a little while to cotton on to that.
|
| Semi-spoiler follows.
|
| So you need to use the appropriate flag with grep to suppress
| the file names.
| bluecalm wrote:
| It looks very nice. One problem I've encountered is that when you
| make a mistake then the name of the file you have to use
| disappears and it's impossible to get it back. What is this
| website created with btw? I like the style a lot.
| skinwill wrote:
| Viewing the page with Safari 26.1 the questions stopped showing
| up after the second challenge. I was left with only Learn and
| View Solutions, which was not very fun since both showed a form
| of the answer.
|
| TL;DR: The page stopped loading properly.
| Milpotel wrote:
| > Safari [..] The page stopped loading properly.
|
| Who would've guessed...
| franticgecko3 wrote:
| Tab complete is completely broken on Firefox mobile (Android)
| derrida wrote:
| Hey this doesn't work : first solution "ls -al" which I use all
| the time to list directories was rejected in the second question
| I used awk and was rejected it expected grep
|
| I think a beginner could be doing it right but then be told they
| are wrong as you aren't evaluating actual commands
|
| Best would be to like actually run it* and then check solutions
| out with awk that it pattern matches
|
| * aka give me a shell ok worth a try lol xD
|
| Edit: also I was expecting something a bit more challenging (also
| that is correct) to like exercise the brain for those of us that
| use shell (this is hacker news) something that takes a few
| minutes and isn't just commands used all the time
| comprev wrote:
| "ls" shows only visible files whereas "ls -a" also displays
| those starting with a dot. Given the question doesn't that make
| your answer the correct one?
| derrida wrote:
| It accepts ls -a as and answer and ls -l but not ls -al
| zenoprax wrote:
| `la -A` will also show hidden files but excludes the "." and
| ".."
|
| I prefer that way in theory but a capital "A" is not as
| quick/easy to type.
| Retr0id wrote:
| It does seem to actually run the submitted commands, and awk is
| there.
| derrida wrote:
| Second question
|
| > awk '/^laugh/ { print $0 }' night-before-christmas.txt
| aidenn0 wrote:
| Get rid of the caret and it works; it wants lines with
| laugh, not lines that start with laugh,
| prmoustache wrote:
| it also doesn't accept the find command.
| benterix wrote:
| It would be nice if the instructions spelled out what to do, then
| I could do it. Otherwise I have to guess what author meant. But
| all in, a nice small exercise, thanks!
| beardyw wrote:
| As a developer I've been through 10 different languages and about
| the same number of operating systems, and I barely managed to
| remember any of them, even at the time. And I assume soon using
| natural language as the main interface will become commonplace,
| which will finally let me off the hook.
|
| I will give this a go, but I doubt any of it will stick!
| k_bx wrote:
| Shell quotes is the last frontier LLM's seem to keep getting
| wrong. Esp when it's Github CI yaml which needs to ssh
| somewhere and run command running another command there. Needs
| AGI apparrently.
| janmatejka wrote:
| 'Seven files that start with Santa' is actually about filenames.
| That's pretty confusing especially since users are primed with
| file contents from the previous exercises already.
|
| And from pipers piping description I had no idea what was wanted
| of me.
| Kakist0crat wrote:
| I think that may be the point, the subtlety of "lines of pipers
| piping" got me for a second - as opposed to the 11 pipers
| piping files (which is what I thought it wanted).
| ParadisoShlee wrote:
| I assumed this was some kind of hacking challenge.
| oneeyedpigeon wrote:
| I think the instructions need more detail. 'Five lines that start
| with "the"' doesn't scream 'or "The", or "thE"' to me...
| sva_ wrote:
| Cool idea but very opinionated and no room for variation
| sannysanoff wrote:
| Fluent in shell, but cultural context is more difficult,
| especially with pipers, had to do guess work.
| ggirelli wrote:
| I think that's part of the fun :)
| dncornholio wrote:
| Terrible. You cannot 'ls' if ls is not the right answer.
| Completely useless.
| imp0cat wrote:
| That's not true. You can absolutely use ls and other commands
| to poke around before creating the winning command.
| blenderob wrote:
| Looks nice but it's rejecting valid commands as incorrect. Like
| when it told me to search for "laugh" I ran grep
| laugh *
|
| There's only one file in the directory. So that's a correct
| answer but the game wants me to run grep laugh
| night-before-christmas.txt
|
| It's like those weird interviewers who have a specific answer in
| mind and they'll accept nothing other than the answer they have
| in mind.
| ggirelli wrote:
| Or cat night-before-christmas.txt | grep laugh
| charlie-83 wrote:
| `grep laugh *` worked for me
| blenderob wrote:
| I tried again to see if they fixed it. No it still doesn't
| work. You'll get the output but look closer.
| Output does not match expected lines - try again
|
| So you can't move on to the next level.
| szszrk wrote:
| they must have fixed it. Works for me, including new
| sessions on separate browser.
| blenderob wrote:
| Still doesn't work for me in a new session separate
| browser. I get the output but I also get this message
| Output does not match expected lines - try again
|
| Does it give you the clue for the next level? Can you or
| someone else share a screenshot or something so I can
| compare to find out what I'm missing?
| szszrk wrote:
| For clean session it goes to the next level.
|
| There is some mess if you already finished the thing, and
| then use url to particular level on a clean session. For
| me it looked like I am on level 2, but site expected
| answers to 1.
|
| When I start from scratch with proper link (main page)
| simple:
|
| grep laugh *
|
| works
| blenderob wrote:
| Worked. Thanks!
| haolez wrote:
| The way that worked for me to properly learn shell is to do a
| non-shell project with it.
|
| Like, do a complex background worker for a web server that
| listens to a socket, does complicated stuff, exports functions
| (if in Bash), etc.
|
| You don't have to use it afterwards. The value is in the journey.
| It's fun :)
| FailMore wrote:
| How would one make a true shell in a website like this one? (As
| in, is there an open source library to host an interactive shell
| for educational purposes - eg codecademy)
| ctippett wrote:
| I couldn't tell you the exact details (I'm only passingly
| familiar with how it works myself), but you'd almost certainly
| want to start by looking into web assembly.
|
| I found a-Shell's documentation[1] quite interesting, it
| describes their use of web assembly and offers some practical
| tips for compiling stuff so it can work in a sandboxed
| environment.
|
| [1]: https://bianshen00009.gitbook.io/a-guide-to-a-shell/lets-
| do-...
| bArray wrote:
| Great idea, but a few feedback points:
|
| 1. It's difficult to know that it is following from the previous
| problem, and then on some problems it changes the workspace.
|
| 2. It's not always easy to know what it wants.
|
| 3. The question about finding a line starting with "The" I
| successfully cheated: cat night-before-
| christmas.txt | grep "The "
|
| 4. Likewise the ending "!": cat night-before-
| christmas.txt | grep "!"
|
| 5. On the eighth day I get a "runner error" with the command:
| mv *lve* Workshop
|
| I'm globbing for the filename match, I'm not sure if it's "elve"
| or "Elve" and then trying to move to the target directory.
|
| Otherwise it's quite fun - the instant feedback is great.
| iN7h33nD wrote:
| iirc Elves is a directory with them inside.
| throw0101d wrote:
| Meta: the first day of the Twelve Days of Christmas is Christmas
| Day (December 25) itself:
|
| * https://en.wikipedia.org/wiki/Twelve_Days_of_Christmas
|
| The days before the 25th are part of the season of Advent:
|
| * https://en.wikipedia.org/wiki/Advent
| xnorswap wrote:
| Too many people I know spend their boxing day packing up their
| tree. Christmas is over before it's barely begun!
|
| But that's kind of understandable when Christmas begins in
| September if you believe the retailers.
| throw0101d wrote:
| > boxing day
|
| Ah, a fellow Commonwealther (I'm Canadian):
|
| * https://en.wikipedia.org/wiki/Boxing_Day
|
| * https://en.wikipedia.org/wiki/Commonwealth_of_Nations
| lo_zamoyski wrote:
| Indeed. Christmas lasts until Epiphany (January 6th) or even
| Candlemas (February 2nd).
|
| Commercialism is likely the culprit for the current state of
| affairs. By putting the "Christmas season" and the
| commercialized variety of festivity before Christmas and
| making Christmas day the big finale, you create a situation
| during which you can get people to buy, buy, buy. And then
| it's over.
|
| Compare that with the real deal and as it was traditionally
| celebrated. Advent is a period of contemplation, waiting,
| quiet, abstinence from meat -maybe even fasting - in
| anticipation for the birth of Christ. Then, on Christmas Eve
| and especially Christmas day, the festivities kick off, and
| they last until January 6th (the 12 days of Christmas) or
| Candlemas (40 days of Christmas). And that's when people used
| to pack up their trees and decorations (either Jan 6th or Feb
| 2nd).
|
| People today suck at festivity. We're boring.
| OkayPhysicist wrote:
| IMO, commercialism moreso moved into the empty husk left
| after the Calvinists got to holidays, _especially_ the
| puritanical sects that took root in the US. Specifically, I
| blame double-predestination: if you tell a bunch of people
| with free will that everyone is sorted into two groups, one
| going to heaven, one going to hell, and that the people
| going to heaven behave a certain way, it creates a much
| more oppressive, all-encompassing culture than traditional
| Christian "apologize and go to heaven because Jesus loves
| you" teachings. If your concern is not being judged
| negatively in the afterlife, you basically just need to
| follow some rules, try to be a generally good person, and
| you're generally free to do whatever else that isn't
| covered in the above categories. If you're concerned about
| demonstrating to others in your community that you are one
| of the God's chosen, who behave a certain way, that
| necessarily becomes universal factor in your life, which
| keeps escalating with time. This preoccupation with not
| being perceived as "having to much fun" so-to-say killed
| festivals.
| throw0101d wrote:
| > _Indeed. Christmas lasts until Epiphany (January 6th) or
| even Candlemas (February 2nd)._
|
| Up to Candlemas was probably more cultural than liturgical,
| as things go back to 'Ordinary time' in the West post-
| Epiphany:
|
| * https://en.wikipedia.org/wiki/Christmastide
|
| *
| https://en.wikipedia.org/wiki/Liturgical_year#Christmastide
|
| * https://en.wikipedia.org/wiki/Epiphany_(holiday)
| einpoklum wrote:
| I tried to grep for " piping " at some point and the website got
| stuck. I wonder what it was trying to do...
|
| other than that - nice exercise for newbie shell dabblers :-)
| Biganon wrote:
| I mean if you ask for the lines that start with "the" and expect
| lines that start with "The", maybe you should say it in the
| instructions.
|
| After the 3rd time I had to peek at "learn" to understand what
| was even asked, I gave up. This is more annoying than fun.
| smusamashah wrote:
| That font is not very easy to read quickly.
| cornonthecobra wrote:
| It doesn't handle backspace correctly. The character is erased
| visually, but not removed from the buffer, so when you type the
| next character, the erased character reappears. Make one typo and
| you have to reload the page.
| 6LLvveMx2koXfwn wrote:
| "Try sending the command ls in the command box to list all files
| in the directory." My answer: `ls -a`
|
| er, wrong. Then don't put _all_ in the question!
| mejthemage wrote:
| I would love something like this that puts me in my own shell.
| Like a light CTF that is really just shell commands rather than
| breaking into a VM
| mejthemage wrote:
| I went searching and realized overthewire has a bash specific
| course called "Bandit". Still a VM you SSH to
| lozf wrote:
| If you like things like this you'll probably enjoy
| b64(r13(MaE3o3OmYz5yqPNtqUu0VPOxnJpX))
| ilvez wrote:
| Constantly hit Ctrl-w and close the tab. Ctrl-Shift-Tab to get
| back to it :-) God bless saved state, otherwise I would not have
| completed :D
| lcuff wrote:
| I thought there was too much ambiguity to several of the
| challenges:
|
| I gave up after the following exercise:
|
| On the eighth day of Shell my true love gave to me Eight elves in
| Santa's Workhop/ ... Hint: Try finding files named after Elves
| and moving them to the Workshop/ directory.
|
| It turns out, all they want is the files in the ./Elves directory
| to the ./Workshop directory. But I didn't figure that out.
| imp0cat wrote:
| You're overthinking it. You can get quite far with a bit of ls
| or find . -type f exploration
| entropie wrote:
| I have serious issues reading that font
| naikrovek wrote:
| I use the shell all day every day and I got stopped at the SECOND
| question.
|
| "lines that contain 'laugh'". lines of _what_? Doesn 't tell you
| without looking at the answer.
|
| genius.
| chillfox wrote:
| That's a nice little challenge.
|
| I did have some issues with Day 11 figuring out what it wanted,
| but overall it was fun.
___________________________________________________________________
(page generated 2025-12-08 23:01 UTC)