[HN Gopher] Ask HN: How can a intermediate-beginner learn Unix/L... ___________________________________________________________________ Ask HN: How can a intermediate-beginner learn Unix/Linux and programming? For a long time, I've been in an awkward position with my knowledge of computers. I know basic JavaScript (syntax and booleans and nothing more). I've learned the bare basics of Linux from setting up a Pi-hole. I understand the concept of secure hashes. I even know some regex. The problem is, I know so little that I can't actually _do_ anything with this knowledge. I suppose I'm looking for a tutorial that will teach me to be comfortable with the command line and a Unix environment, while also teaching me to code a language. Where should I start? Author : learnTemp229462 Score : 52 points Date : 2020-03-21 19:39 UTC (3 hours ago) | jonahlibrach wrote: | Learning to use the command line is a requirement for all serious | programmers and its great you want to start. | | It can be pretty overwhelming to use the terminal so you may have | to some reading to get yourself really comfortable. | | I usually go to books/(book pdfs) to help me start out because | they have conceptual explanations about the syntax which really | helps my understanding. | | Maybe this one would be good? The Linux Command Line, 2nd | Edition: A Complete Introduction | | Once I'm comfortable based on the book, using StackOverflow and | other websites becomes much, MUCH easier. | | In the process, you'll learn BASH which is used for scripting. | severine wrote: | > _Maybe this one would be good? The Linux Command Line, 2nd | Edition: A Complete Introduction_ | | Free PDF in the author's (William Shotts) homepage: | http://www.linuxcommand.org/tlcl.php/ | tdy721 wrote: | Keep hacking your raspberry pi. Customize your shell with a | profile; maybe alias LS so it always uses color? Find some | packages to install. Cowsay, and SL are great, udderly useless ;) | programs. Check em out. | | Keep projects small, just patch together open source code for | fun, and read the open stuff you do use. | | You could also switch the GUI environment of your raspberry pi. | Install headless raspbian and install he GUI from the CLI. Just | hack! | | My koan is video poker, I've rewritten a whole game about 3 | times. I also like writing prime number finders in new languages. | TheDesolate0 wrote: | https://tldp.org | mooneater wrote: | I disagree with lots of advice here. | | My strategy to solidify my linux skills was simple: commit to | linux desktop. We spend most of our time on our desktop, may as | well let that time earn you skill points. I picked ubuntu and use | the same on servers. You naturally learn a bit every day through | daily use. This really adds up over time without extra effort of | using a side system. Getting good at windows or osx is a waste of | your time unless you are specifically into those platforms. | | As for a language, pick one that is (1) easy to start with (2) | covers advanced use cases, (3) sound in its design, (4) general | purpose, (5) concise. That rules out C (due to 1), JS (due to 3 | and 4), php (2,3,4) and most things really. | | For me that left me with ubuntu and python, I never looked back. | (Yes I know many other things but that is my home base.) | roenxi wrote: | Commit to using, _breaking and fixing_ a Linux desktop to learn | quickly. I learned a lot running Debian Unstable back back when | men were men and unstable was really unstable; so the 2010s. | | If minor things are constantly going wrong and getting fixed | then the only way that can happen is the user building up a | good mental model of how the system works. | | An update that breaks X11 will teach you a world of information | about terminals. "How do I use a messaging client in a | terminal?", "What text editors work in a terminal?", "How do I | browse the web from a terminal?", "What games are there for | terminals", "How do I watch a movie in the terminal" (ascii). | | Get forced to live like that for a week and you also learn how | to fix X11 (eg, learning about the difference between 2D and 3D | graphics drivers, OSS vs non-OSS drivers, kernel vs userspace). | Valuable life skills. Godspeed to the Wayland devs. | asveikau wrote: | It is trendy to hate C now, but if you want to understand a | Unix-like OS I think it is mandatory and they go hand in hand. | Otherwise, you will have no idea what kind of interface your | higher level language is abstracting. | | It's ok to not like it, but don't let that dislike be due to | lack of understanding. | fao_ wrote: | > , (5) concise. That rules out C (due to 1) | | That's interesting, most people I've started on C have found it | easier to start out in that than say, Java, which has been on a | hell of a lot of introductory courses for a decade now | empath75 wrote: | Counterpoint: I've been a Linux sysadmin and developer for | close to 10 years at this point and I've never used Linux as a | desktop. I've only used MacBooks. | | The skills you need to run Linux on the laptop aren't | particularly close to what you'd need to run Linux as a server, | IMO, particularly Linux as a VM. | Jnr wrote: | I remember I used Ubuntu Desktop in 2008 for a year or two. | But Ubuntu is point and click and anyone can use it. I did | not learn much about Linux using it. | | I felt that I really started understanding how things work | when I switched to something requiring more reading - | Archlinux. | | To get a running desktop it not only required doing all kinds | of things I did not understand back then, it also provided | great Wiki to get there. I still sometimes end up in that | Wiki to quickly get up to speed about some tools or concepts. | | And the fact that it is rolling release distro and was always | running the latest upstream software version meant that | frequently at least the UI part broke down, and that forced | me to learn even more things. :) | | That was only the beginning but now it feels like it opened | many possibilities and career paths for me. It probably was a | bit frustrating at the beginning but it is worth it. | jpxw wrote: | OS X exposes you to a decent amount of Unix stuff anyway. | It's quite a good compromise imo. | unixhero wrote: | Yes. Run a Linux desktop and only stay in it. | jameshe wrote: | Based on personal experience, I can totally echo this comment. | I am a business undergrad (senior year), but I am a JavaScript | developer for a local start-up. On my Windows laptop, my | workflow included applications from MS Office, as well as | PowerShell and Vim. At the beginning of this semester, my | laptop broke (screen) and I couldn't afford a repair, so I dug | up an old ThinkPad T430 that I installed Ubuntu on a couple | years back. It was an old machine (2012?) that I bought used, | after some searching done on my phone, I upgraded the OS and | got to work. | | Based on my experience with the switch, I've learned miles more | about Linux and how computers work than I would've before. I | might even say I like the experience more than I did before. On | top of that, as the parent comment says, I've learned more | about Linux, shell script, the directory tree, regular | expressions, etc., than I think I would've otherwise by self- | teaching. It might (read: "definitely will") be uncomfortable | at first, but the Linux community is big and helpful and | there's plenty of great open-source software that can replace | your old workflows. | | As far as picking a language goes, I started with Python for | the reasons above, but really, starting anywhere is better than | being stuck deciding. Common starting points are Python, Java, | JavaScript, C#, but really, just pick any language with a large | community to help you out. When you think you know enough, | consider ideas for a personal project, which is where you'll | likely learn the most. After that, keep learning and if you | think you want to learn something else, you'll realize how much | easier it will be with one language under your belt already. | pbh101 wrote: | Some resources I've found helpful to learn some command-line: | | - https://cmdchallenge.com/. This set of increasing-in-difficulty | challenges should help with structure in terms of learning a bit | more. | | - https://explainshell.com/ can be helpful as well. | | - Don't forget the man pages! `man <command>` can be quite | helpful! For a different approach on teaching some, bropages.org | could be helpful. | | - I haven't used it personally, but there is a lot of info at | http://www.opsschool.org/ | | As for learning to program, I suggest a very good starter | language is Python, and its built-in, first-party language | reference/tutorial I found helpful when I learned it: | https://docs.python.org/3.8/tutorial/index.html | | As for "what" to program after that, I don't have any great | resources for what constitutes some good initial programs. Off | the top of my head, here are some ideas about places to start | which are doable with only inputting and outputting text: | | - FizzBuzz | | - Play Rock Paper Scissors with the computer | | - Play Tic Tac Toe with the Computer | | - Sieve of Eratosthenes | | - Conway's Game of Life | | - Given a piece of text, count how many occurrences of each word | there are and display the top ten. | morty_s wrote: | There are many ways, but here is one: | | Read and lightly work through The C Programming Language (K&R). | Code along with the book, don't feel you have to really deep-dive | anything. | | You don't have to learn C well at this point. Just learn from it. | | Then start reading The Art Of Unix Programming. Do this casually. | Read a bit, code a bit. Between K&R and TAOUP, you'll be inspired | by to write at least two small projects. | | To supplement K&R and TAOUP, begin reading Unix Network | Programming. | | If you have access to a Mac or a Linux machine, explore the man | pages. | | If you're on a Mac, explore the man pages __and__ the code that | lives on your system. | | One way to do this is to use something like vscode's intellisense | to "Go to Definition." E.g., when you're coding an example from | K&R, right click on one of the included headers, and click "Go to | definition." It will take you to the header file. Look through | the code. Then you could look at the code from FreeBSD or OpenBSD | on GitHub. | | Edit: Just wanted to add, by doing the above you'll get exposure | to your system in new ways. Moreover, you'll find yourself | learning Unix out of necessity, for fun, and by accident. You can | practice the art of Unix programming in almost any language at | this point. C is unix-y, but so is Rust. | osrec wrote: | Download Ubuntu and run it as a virtual machine inside your | current machine (use Google for instructions - it's fairly | straightforward with a piece of software called virtualbox). That | should stop you from running into hardware related compatibility | issues. | | Get familiar with the interface and the concept of a "terminal". | | Then try do some simple stuff. Maybe set up nginx (or Apache) to | run a web server that you can access via your host machine. | | Thereafter try doing some Linux admin tasks, like creating users, | switching users. Maybe even set up SSH and try accessing the | virtual machine from your host machine via PuTTY. | | After, maybe try spinning up a simple node web app on the virtual | machine and access it from a browser on your host machine. | | By this time, you'll probably get a sense of what you want to | explore next! And remember, Google it's your friend for all of | the above! | | All the best :) | learnTemp229462 wrote: | I'll probably use my raspberry pi instead of installing a VM. | osrec wrote: | Sure - the only benefit of a VM is that you can mess up the | VM's filesystem without worrying about it too much. | disgruntledphd2 wrote: | Making terrible mistakes on real machines teaches you much | more though (by sheer necessity if nothing else). | b215826 wrote: | _The Missing Semester of Your CS Education_ [1] is a set of | tutorials from MIT that gets you to speed with using the CLI, | using a text editor (Vim), version controlling (using Git), basic | debugging, etc. Some tutorials aren 't perfect (e.g., an earlier | version had things like `for f in $(ls)` [3]), but at least they | link to good tools and resources. There's also Software Carpentry | [2], which has similar goals. You might also want to check out | _The Bash Guide_ [4,5], which is hands down the best Bash | tutorial written. | | [1]: https://missing.csail.mit.edu/ | | [2]: https://software-carpentry.org/lessons/index.html | | [3]: https://mywiki.wooledge.org/ParsingLs | | [4]: https://mywiki.wooledge.org/BashGuide | | [5]: https://guide.bash.academy/ | Waterluvian wrote: | I wonder if introducing newbies to makefiles and vim is super | empowering, or ends up gatekeeping by making it look "as | complicated as you feared it would be." | | I feel like before any of that: | | 1. Do practical stuff with Python | | 2. Learn the semantics behind the Linux directory tree | | 3. CLI, piping stuff together, a little bit of bash. | jahbrewski wrote: | But at some point isn't it helpful to know that some things | _are_ as difficult as you fear, and you just have to power | through? I picked up vim early in my programming career and I | think it was one of the best decisions I've made; I use it | every day. Yeah, there's a time and place for learning | "easier" things, but there's also a time to buckle down, get | serious, and dig in. | kyawzazaw wrote: | i am a student and even using nano makes me feel less | efficient and productive. | | is there something I am missing out by not using vim? | b215826 wrote: | > _is there something I am missing out by not using vim?_ | | Being able to use vi is a very handy skill if you're a | sysadmin or SSH into other computers/clusters very | frequently. Since vi is part of the POSIX specification, | all Unix systems would have some implementation of vi. Of | course, Vim is much more powerful than a text editor like | nano, but also requires more investment to learn. It | won't make you a better programmer, but it might make you | a faster programmer. | threatofrain wrote: | It's hard to look like a true haxxor. | b215826 wrote: | > _I wonder if introducing newbies to makefiles and vim is | super empowering, or ends up gatekeeping by making it look | "as complicated as you feared it would be."_ | | This tutorial introduces Vim only after introducing shell and | pipes. I was wrong about makefiles -- this tutorial doesn't | include makefiles (I was thinking about Software Carpentry | [1], which has similar goals). In any case, learning Vim | isn't hard as people make it out to be, and one can easily | skip that part of the tutorial to come back to at a later | point without breaking the continuity. | | [1]: https://software-carpentry.org/lessons/index.html | sys_64738 wrote: | You need a goal which is a tangible end product. Everything else | derives from that core requirement. E.g. write a multithreaded | chat program with a separate remote backend. | klyrs wrote: | That's way complicated for a newbie project... I'd go with | something like a snake game | toohotatopic wrote: | Try this recent HN submission: Text Processing in the Shell | https://news.ycombinator.com/item?id=22590824 | smitty1e wrote: | I regularly recommend installing VirtualBox, obtaining a Linux | distro, e.g. fro. OSBoxes.org, and using it to do a | http://linuxfromscratch.org/ project. | | LFS is well-document and maintained, and levels you up in a jiffy | on the practical basics. | | It's not about programming per se, but covers quite a few | concepts you're expected to "just know". | | Plenty of pointers to more advanced concepts, too. | seankross wrote: | I wrote a free book for getting started with the command line | that may interest you: https://seankross.com/the-unix-workbench/ | smabie wrote: | I would recommend learning Linux the way I did 15 or so years | ago: get rid of other operating systems and use a more 'advanced' | distribution (such as Arch or Gentoo). In my case, I fucked up my | Windows install on a new laptop when I was 12. At that point, I | was stuck and just decided to stick with Linux. It's remarkable | how quickly you learn when you absolutely need to in order to use | the computer. | | My second piece of advice would be to learn C from this book: | https://en.wikipedia.org/wiki/The_C_Programming_Language | | After finishing it and completing all the exercises, you should | be ready to go learn anything else you want to. | heavyset_go wrote: | Shoehorn Linux into your life, even when there are other | solutions that you're familiar with that already solve your | problems. | grumpy8 wrote: | I strongly recommend "A Practical Guide to Linux Commands, | Editors, and Shell Programming". It's a great overview of many | things linux & command line. Very approachable for beginners and | more than good enough to make them dangerous. | nicklaf wrote: | Honestly? When I was in high school I was fortunate enough to | find a copy of _The Unix Programming Environment_ [0], which is a | marvelously accessible tutorial introduction to incrementally | building UNIX(r) programs using nothing more than the pipe | operator, which means you can start writing 'programs' that work | on the output of other programs, until your program snowballs | into a longer pipeline. The book was published in 1984 and works | verbatim on any Linux system today. | | Once you grasp how powerful this closed system of incrementally | processing text is, you are sort of unstoppable at the command in | a *nix system. | | Pay careful attention to regular expressions, which are a | universal tool in Unix for processing text. Along with Unix' | treatment of files as a stream of newline terminated strings, | this how Unix gets away with working with unstructured files | instead of something like XML or S-expressions): that is, most | Unix tools expect you to work with a file (or file descriptor, | which is a pointer to any file-like thing in memory), and to | process it one line at a time, and to use regular expressions to | parse those lines into fields. | | Working with lines using regular expressions is how the original | editor, /bin/ed, was conceived, before the existence of visual | editors like Vim and Emacs: you can find, print, and also edit | lines in the file using regular expression syntax in ed, and this | knowledge, btw, translates to fluent use of regular expressions | in both sed ("stream editor", or basically a non-interactive | version of /bin/ed, which essentially executes your editor | commands and then exits), and egrep (which searches for lines | matching your regular expression). | | In fact, once you start to see these pieces come together, look | for examples in Kernighan and Pike[0] which demonstrate the use | of awk. Awk is an extremely powerful but also extremely simple | tool for processing data in Unix, using all the concepts I just | described, and not much else. It has a few extra features, like | variables and loops, which you'd expect in a programming | language, but you are expected to use Awk exactly like you'd use | things like grep, ed, and the shell. It's just that now you've | got this very compact, powerful notation for splitting records | (lines) into fields (regular expression matches), and then doing | arbitrary things with them to spit text back out. You could even | write your own database using something like Awk, and you can | read about how to do database-like tasks in the classic and | accessible book on Awk by the original authors of the tool (Aho, | Weinberger, and Kernighan, whose last initials together form the | name AWK)[1]. | | Then, much later in life, when you find yourself doing some fancy | stuff in Haskell and creating a DSL to do things like process | pipelines, you realize that Awk was actually way ahead of its | time. | | [0] | https://en.wikipedia.org/wiki/The_Unix_Programming_Environme... | | [1] https://en.wikipedia.org/wiki/The_AWK_Programming_Language | bluemooner wrote: | Here's a couple of tutorials on various tools that might be | useful for a beginner: https://missing.csail.mit.edu/ | stank345 wrote: | My advice is to start working on a project you care about and | then learn everything required to make it happen. If you already | know JavaScript, maybe build and deploy a static website. Once | you've done that then perhaps make it interact with an API. | jordanpg wrote: | This. Having something to actually accomplish is much more | important than finding the ultimate book or online course. | There are lots of those. | | Pick one and move on to defining a realistic project that seems | interesting and achievable. | | Most important of all, finish it, and write what you did down | somewhere. It took me 20 years to realize how important this | is. | worik wrote: | If you want to learn programming, from my point of view, learn C. | goshx wrote: | For programming, start by having a project. Think about something | you'd like to build and focus on one thing at a time. This will | guide your research. | | For Unix, install linux on your computer and use it daily. You'll | be forced to learn. | chipperyman573 wrote: | >For Unix, install linux on your computer and use it daily. | You'll be forced to learn. | | I tried this years ago and it didn't end well. With how | complicated current-gen distros are, you need to understand | what's going on under the hood before you can effectively mess | with it. In my experience you'll just end up with one screen | that's only at 720p and a crashed pulseaudio that you never fix | because you just want to watch netflix right now, and for some | reason that still works as long as you use bluethooth. Even | though you didn't _want_ to use your bluetooth headphones, it | 's easier than fixing the problem with your sound driver or | whatever so you'll just end up using them anyway. | | It might be easier to start with server management because you | don't have to figure out much human IO stuff... Linux is really | good at talking to Linux. VPSs are cheap and give you root | access. Plus if you mess up, it's generally pretty easy to just | format the VPS and start over. You can't easily do the same on | a desktop. Also it forces you to learn about Linux and not | whatever software your distro uses (for example, learning how | to use apt is a lot more important than the ubuntu app store) | goshx wrote: | I don't know how long ago you've tried it, but that was | pretty much my experience as well. However, in my case we are | talking late 90's. Things have changed a lot since then. | chipperyman573 wrote: | About 3-4 years ago. I disagree with most poeple that say | it's just as easy as using w10 now, it takes way more work | to make it as stable as windows (which takes none). It's | just a lot more powerful and easy to modify when you want | it to be. | | BTW if the OP (or anyone else) is wondering, now I run w10 | and minimal Ubuntu with i3. The knowledge transferred | basically 1:1 from server management (except for window | manager stuff, but that was easy to research) | starpilot wrote: | Use Slackware, do these exercises: | | - Customize your bash prompt, create aliases for some common | commans (ls, df are good) | | - Build a LAMP stack, compile everything from source tarballs. | Get it working so that you're able to browse your webserver from | your phone. | | - Update a sound or video driver | | - After you're comfortable, recompile the kernel | | - Through these, do as much in the command line as you can. Get | comfortable with mv rm chmod chown and so on. | | Any time you have edit a text file, use vim, nothing else. | jimnotgym wrote: | If you are on Windows I recommend setting up Windows Subsystem | for Linux. With VScode. You now have a Linux server with remote | code editing. I note you have an Raspberry pi, what follows will | work with the pi as well with whatever remote machine. Complete | these tasks | | 1) install the language of your choice and start a simple web | site using the languages webserver. View the website in your | browser on Windows. A Python Flask 'hello world' or a Node one? | | 2) Set up an SSH server and remote in from the Windows machine. | Learn how to set it up to use keys only instead of passwords. | Find out why that is a good idea | | 3) learn Git. Github has some nice tutorials. | | 4) set up NGinx to run your website above. | | 5) set up Nginx for https | | 6) set up LetsEncrypt. | | 7) set up a free AWS account, start a server and put your website | on it using SSH and git. | | 8) look through the ssh log files to see login attempts, and the | Nginx logs. Imagine there were millions of rows, how would you | find a certain one, or the last few? (head, tail, grep, cat). | | That should get you somewhere.! | DyslexicAtheist wrote: | a really good book is Richard Stevens Advanced Programming in the | UNIX environment[1]. (sounds daunting but it's not too bad when | you combine it with another introductory text on C). If you stick | with C you'll eventually know UNIX/Linux a lot deeper than | anyone. It takes time though so go easy on yourself. | | Also check github for a bunch of repos that contain biolerplate | code that is used in most deamons illustrating signal handling, | forking, etc.[2] | | Also I suggest taking some open source projects from Daniel | Bernstein (DJB) as examples on how to write secure code. qmail, | djbdns, daemontools ... there are lots of great ideas there[3] | | Write a couple of simple programs that utilize your code and | expand from there, learn the plumbing, e.g. write a Makefile, | learn autotools/autoconf, how to write tests, how to use gdb, how | to create shared libs and link a program | LD_LIBRARY_PATH/ldconfig, etc ... | | Most important think about something that you like to write and | go from there. Back in the late 90ies I studied RFC's (MIME, | SMTP, etc) and then implemented things that I could actually use | myself. Here is a recent project I did some weeks ago (an extreme | edge-case for security maximalists which will never be used by | anyone other then myself, ... but I really enjoyed writing this | and learned a bunch of new stuff while doing so)[4] | | if you need ideas or help with looking at your code, don't | hesitate and send me a mail. | | [1] | https://en.wikipedia.org/wiki/Advanced_Programming_in_the_Un... | | [2] https://github.com/jirihnidek/daemon | | [3] https://cr.yp.to/djb.html | | [4] https://github.com/DyslexicAtheist/nfq/ | westurner wrote: | > _Also check github for a bunch of repos that contain | biolerplate code that is used in most deamons illustrating | signal handling, forking, etc.[2]_ | | docker-systemctl-replacement is a (partial) reimplementation of | systemd as one python script that can be run as the init | process of a container that's helpful for understanding how | systemd handles processes: https://github.com/gdraheim/docker- | systemctl-replacement/blo... | | systemd is written in C: https://github.com/systemd/systemd | | > _examples of how to write secure code_ | | awesome-safety-critical > Coding Guidelines | https://github.com/stanislaw/awesome-safety-critical/blob/ma... ___________________________________________________________________ (page generated 2020-03-21 23:00 UTC)