Lecture 1: Course Overview + The Shell (2020)

all right everyone thanks for coming in this is the missing semester of your CS Education at least that’s what we chose to call the class if you’re not here for this class then you’re in the wrong room we will be here for about an hour just to set your expectations and I want to talk to you a little bit first about why we’re doing this class so this class stems out of an observation that Anish and Jose and I have made while TA-ing various classes at MIT which is that basically all of us computer scientists we know that computers are great at doing these repetitive tasks and automating things but we often fail to realize that there are lots of tools that can make our own development processes better we can be a lot more efficient about how we use our computers because we can use the computer as a tool for ourselves not just for building websites or software those sorts of things and this class is an attempt to address this is an attempt to show you some of the tools that you can use to great effect in your day to day in your research and in your studies and it’s going to be a class where we want you to teach you both how to make the most of the tools that you already know but also hopefully teach you about some tools so you don’t know from before and how to combine those tools to produce more powerful things than you think you might be able to do with what you know today the class is going to be structured as a series of 11 one-hour lectures and each one is going to cover a particular topic you can see the website which is also listed there for the list of lecture topics and what date will do each one they will mostly be independent and so you can sort of show up for the ones that you’re interested in but we will sort of assume that you’ve been following along so that as we get to later lectures I’m not going to be teaching you bash all over again for example we we are also going to post both the lecture notes and recordings of the lectures online exactly when we do that we haven’t established yet but it will be after the lectures obviously the videos have to be posted after the class is gonna be run by me John and Anne each sitting over there and Jose who is not currently here but we’ll be holding tomorrow’s lecture and keep in mind that we’re trying to cover a lot of ground over the course of just 11 one-hour lectures and so we will be moving relatively rapidly but please do stop us if there’s anything where you feel like you’re not following along if you feel like there’s something you wish we would spend more time on just let us know please interrupt us with questions and also after each lecture we’re going to hold office hours on the ninth floor of building 30 to the Stata Center of the computer science building as if you show up up in the ninth floor lounge there and the gates tower then you can come and try some of the exercises that we give for each lecture or just ask us other questions about things we’ve talked about in lecturer or other things about using your computer efficiently due to the limited time that we have available we’re not going to be able to cover all tools and full detail and so we’ll try to do is highlight interesting tools and interesting ways to use them we won’t necessarily dig into the deep details about how all of it works or more elaborate use cases but if you have questions about them please come ask us about that too many of these tools are tools that we have used for years and we might be able to point you to additional interesting things you can do with them sort of like take advantage of the fact that we’re here this class is going to I don’t wanna say ramped up quickly but what’s going to happen over the course of this particular lecture is that we’ll cover many of the basics that we assume that you will know for the rest of the semester things like how to use your shell and your terminal and I’ll explain what those are – those who you’re not familiar with them and then will pretty quickly ramp up into more advanced tools and how to use them you can already see from the lecture notes the kind of topics that we’re going to be covering and so that brings us to today’s lecture in which we are going to cover the shell and the shell is going to be one of the primary ways that you interact with your computer once you want to do more things than what the sort of visual interfaces you might be used to allow you to do the visual interfaces are sort of limited in what they allow you to do because you can only do the things that there are buttons for sliders for input fields for often these textual tools are built to be both composable with one another but also to have tons of different ways to combine them or ways to program and automate them and that is why in this class we will be focusing on these command line or text-based tools and the shell is the place that you would do most of this work so for those of you are not familiar with the shell most platform provides some kind of shell on Windows this is often PowerShell but

there are also other shells available on Windows on Linux you will find tons of terminals these are windows that allow you to display shells and you’ll also find many different types of shells the most common of which is bash or the born again shell because it’s such a common shell it is the one we’re primarily going to be covering in these lectures if you’re on Mac OS you will probably also have bash maybe an older version of it if you open the terminal app and so if you want to follow along on any of these platforms feel free but keep in mind that most of this is going to be sort of Linux centric in terms of how we teach it even though most of these tools work on all the platforms if you want to install a terminal and a shell and you don’t know how to do it well we’re happy to show you at office hours or it’s usually very easy to just Google like your platform plus like terminal and you will get one now when you open a terminal you get something that looks a little bit like this so it will usually have just a single line at the top and this is what’s known as the shell prompt you can see that my shell prompt looks like this it has my user name the name of the machine that I’m on the current path I’m on and we will talk about paths a little bit later and then it’s really just sort of blinking they’re asking me for input and this is the shell prompt where you tell the shell what you want it to do and you can customize this prompt a lot and when you open it on your machine it might not look exactly like this it might look something like this if you’ve configured it a little or it might look all sorts of different ways we won’t go too much into customizing your shell in this particularly we’ll do that later here we’re just going to talk about how do you use this shell to do useful things and this is our the main textual interface you have to your computer’s through this shell on the shell prompt you get to write commands and commands can be relatively straightforward things usually it’ll be something like executing programs with arguments what does that look like well one program we can execute is the date program we just type date and press enter and then it will show you unsurprisingly the date and time you can also execute a program with arguments this is one way to modify the behavior of the program so for example there is a program called echo and echo just prints out the arguments that you give it and arguments are just white space separated things that follow the program name so we can say hello and then it will print hello back perhaps not terribly surprising but this is the very basics of arguments one thing that you’ll notice is that I said that arguments are separated by whitespace and you might wonder well what if I want an argument as multiple words you can also quote things so you can do things like echo hello space world and now the echo program receives one argument that contains the string hello world with a space well you can also use single quotes for this and the difference between single quotes and double quotes will get back to and when we talk about bash scripting you can also just escape single characters so for example hello world this will also work just fine all of these rules about how you escape and how you parse and quote various arguments and variables we’ll cover a little bit later hopefully you won’t run into too many we oughta tease about this just keep in mind at least that spaces separate arguments so if you want to do something like make a directory called my photos you can’t just type like make directory my photos it will create two directories one called my and one called photos and that is probably not what you want now one thing you might ask is how does the shell know what these programs are when I type date or when I type echo how does it know what these programs are supposed to do and the answer to this is your program your computer has a bunch of built-in programs that comes with the machine just like you your machine my chip with like the terminal app or it might chip with like Windows Explorer or at my chip with some kind of browser it also ships with a bunch of terminal centric applications and these are stored on your file system and your shell has a way to determine where a program is located basically has a way to search for programs it does this through something called an invariant environment variable an environment variable is a variable like you might be used to for programming languages it turns out that the shell and the bourne-again shell in particular is really a programming language this prompt that you’re given here is not just able to run a program with arguments you can also do things like while loops for loops conditionals all of these that you can define functions you can of variables and all of these things you can do in the shell will cover a lot of that in the next lecture on shell scripting for now though let’s just look at this particular environment variable

environment variables are things that are set whenever you start your shell they’re not things you have to set every time you run your shell there are a bunch of these that are set things like where is your home directory what is your username and there’s also one that’s critical for this particular purpose which is the path variable so if I echo out dollar path this is going to show me all of the paths on my machine that the shell will search for programs you’ll notice that this is a list that is colon separated it might be kind of long and hard to read but the essentials is that – whenever you type the name of a program is gonna search through this list of paths on your machine and it’s gonna look in each directory for a program or a file whose name matches the command you try to run so in my case when I try to run date or echo it’s gonna walk through these one at a time until it finds one that contains the program called date or echo and then it’s gonna run it if we want to know which one it actually runs there’s a command called which which lets us do that so I can type which echo and will tell me that if I were to run a program called echo I would run this one it’s worth pausing here to talk about what paths are so paths are a way to name the location of a file on your computer on Linux and Oh Mac OS these paths are separated by slashes forward slashes so you’ll see here that this is in the in the root directory so the slash at the very beginning indicates that this is starting from the top of the file system then look inside the directory called USR then look inside the directory bin and then look for the file called echo on windows paths like this are usually separated by back slashes instead and we’re on Linux and Mac OS everything lives under the root name space so all paths start with a slash or all absolute paths on Windows there is one root for every partition so you might have seen things like C colon backslash or D colon backslash so Windows has separate sort of file system path hierarchies for each each Drive that you have whereas on Linux and Mac OS these are all mounted under one namespace you’ll notice that I said the word absolute path and you might not know what that means so absolute paths are paths that fully determine the location of a file so in this case this is saying this is talking only about a specific echo file and it’s giving you the the full path to that file but there are also things known as relative paths so a relative path is relative to where you currently are and so the way we find out where we currently are is you can type PWD for present working directory present print working directory so if I type PWD it will print out the current path that I’m in right so currently I’m in the home directory under the root and then John under that and then dev under that etc from here I can then choose to change my current working directory and all relative paths are relative to the current working directory which is basically where you they are in this case for example I can do CD / home CDs change directory this is the way that I change what my current working directory is in this case I change to home and I am now you’ll see my my shell prompt change to say that I am now in home it just gives me the name of the last segment of the path but you can also configure your terminal to give you the full path whenever you’re anywhere and now if I type PWD again it will tell me I’m in slash home there are also a couple of special directories that exist there is dot and dot dot dot means the current directory dot dot means the parent directory so this is a way that you can easily navigate around the system for example here if I type CD dot dot it will tell me that I am now in slash so I’m now in the root of the file system I was in slash home now I’m in slash and indeed if I type PWD well it will do that right thing and I can also then use relative paths to go down into the file system right so I can do CD dot slash home and this is gonna CD into the home directory under the current directory right so this will bring me back to slash home if I now tried CD dot slash home again it will say there’s no such directory because there is no home directory under the current directory I’m on which I changed by doing CD right and I can sort of see de all the way back to the place that I was using

relative paths and I can also do things like dot dot dot dot dot to get back to somewhere deep in my file system this happens to be all the way back to the root so here there’s a bin directory and another bin there’s an echo file and so then I could do world and that runs the echo program under bin alright so this is a way that you can construct paths to arbitrarily traverse your filesystem sometimes you want to absolute paths and sometimes you want relative ones usually you want to use whichever one is shorter but if you want to for example run a program or write a program that runs the program like echo or date and you want it to be able to run be run from anywhere you either want to just give the name of the program like date or echo and let the the shell use the path to figure out where it is or you want to give its absolute path because if you gave a relative path then if I ran it in my home directory and you ran it in some other directory it might work for me but not for you in general when we run a program it is going to be operating on the current working directory at least by default unless we give it any other arguments and this is really handy because it means that often we don’t have to give full paths for things we can just use the name of files and in the directory that we’re currently in one thing that’s really useful is to figure out what is in the current directory we’re in so we already saw PWD which prints where you currently are there’s a command called LS which will show you it will list the files in the current directory so if i type LS here this is all the files in the current directory right and this is a handy way to just quickly navigate through the filesystem you’ll see that if I sort of CD dot and then do LS it’ll show me the files in that directory instead but with LS I can also give it LS dot dot like I can give it a path and then will LS that file instead of the one that I’m currently in or LS that directory and you can see this if I go all the way to the root as well right root has different files one handy trick you might not know about here is there are two other special things you can do one is the tilde character this character brings you to your home directory so tilde always expands to the home directory and you can do relative paths to it so I can do tilde slash dev slash P DOS classes missing semester and now I’m there because tilde expanded to slash home slash John there is also for CD in particular a really handy argument you can give which is – if you do CD – it will CD to the directory you were previously in so if I do CD – I go back to root if I do CD – again I go back to missing semester so this is a handy way if you want to toggle between two different directories in the case of LS or in the case of CD there might be arguments do you don’t know about right currently we haven’t really been doing anything except giving paths but how do you even discover that you can give a path to LS in the first place well most programs take what are known as arguments like flags and options these are things that usually start with a – one of the Hemi is one of these is – help most programs implement this and if you run for example LS – help it all helpfully print out a bunch of information about that command and you’ll see here that it says the usage is LS and you can give some number of options and you can give some number of files the way to read that usage line is triple dot means one like zero or one or more and the square bracket means optional so in this case there’s an optional number of options and there’s an optional number of files and you’ll see that it says what the program does and also specifies a number of different types of flags and options you can give usually we call things that are a single dash in a single letter a flag and anything that or anything that doesn’t take a value a flag and anything that does take a value an option so for example – a and – all are both flags and – C or – color R is an option one thing you’ll see under here if you scroll down far enough is the – L flag and that’s unhelpful the – L flag the – L flag uses a long listing format now that’s particularly helpful in and of itself but let’s see what it actually does so if I do LS dash L it still prints the files in the current directory but it gives me a lot more information about those files and this is something you’ll find yourself using quite a lot because the additional information it gives you

is often quite handy let’s look at what some of that information ah so first of all the D at the beginning of some of these entries indicate that something is a directory so the underscore data entry here for example is a directory whereas for for hTML is not a directory it’s a file the following letters after that indicate the permissions that are set for that file so this like we saw earlier I might not be able to open a given file or I might not be able to CD into a given directory and this is all dictated by the permissions on that particular file or directory the way to read these is that the the first group of three are the permissions are set for the owner of the file all of these files you’ll see are owned by me the second group of three characters is for the permissions for the group that owns this file in this case all of these files are also known by the john group and a final group of three is a list of the permissions for everyone else so anyone who’s not a user owner or a group owner this directory is perhaps kind of boring because all of the things are owned by me but if we do something like CD to slash and do LS dash L you’ll see that here all of them are owned by root we’ll get back to what the root user is but here you see some of the permissions are a little bit more interesting the groups of three are read write and execute what these mean differs for files and for directories for files it’s pretty straightforward if you have read permissions on a file then you can read its contents if you have write permissions on a file then you can save the file you can add more to it or you can replace it entirely and if you have execute to the X bit on a file then you’re allowed to execute that file so if we do LS al in slash bin that’s a novel and user bin you’ll see that all of them have the execute bit set even for people who are not the owner of the file and this is because the echo program for example we want everyone on the computer to be able to execute there’s no reason to say only certain users can run echo that doesn’t really make any make any sense for directories though these permissions are a little bit different so read translates – are you allowed to see which files are inside this directory so think of read as lists for a directory are you allowed to list its contents write for a directory is whether you are allowed to rename create or remove files within that directory so it’s still kind of right but notice that this means that if you have write permissions on a file but you do not have write permissions on its directory you cannot delete the file you can empty it but you cannot delete it because that would require writing to the directory itself and finally execute on directories is something that trips people up a lot execute on a directory is what’s known as search and that’s not terribly helpful a name but what that means is are you allowed to enter this directory if you want to get to a file if you want to open it or read it or write it whatever you want to do basically to CD into a directory you must have the execute permission on all parent directories of that directory and the directory itself so for example for me to access a file inside slash user slash bin such as user bin echo I must have executed on route I must have execute on user and I must have execute on bin if I do not have all those execute bits I will not be allowed to access that file because I won’t be able to enter the directories along the way there are a number of other bits that you might come across like you might see esses or T’s in these lists you might see LS those we can talk about in office hours if you’re curious they will mostly not matter for anything you will do in this class but they are handy to know about so if you’re curious about them look them up on your own or come ask us in office hours there are some other programs that are handy to know about oh sorry there’s one more thing as I mentioned if you just have a dash it means you do not have that permission right so if it says for example our dash X it means that you have read and execute but you do not have right there are some other handy programs to know about at this point one of them is move or the MV command so if I CD back to missing semester here MV lets me rename a file and rename here takes two paths it takes the old path in the new path this is means that move lets you both rename a file like if you change the name of the file but not the directory or it lets you move a file to a completely different directory it just you give the path to the current file and the path to where you want that file to be and that can change its location

and its name so for example I can move dot files dot MD to be food MD unhelpfully right and similarly I can move it back there’s also the CP command the CP or copy is very similar it lets you copy a file CP also takes two arguments it takes the path you want to copy from and the path you want to copy to and these are full paths so I could use this for example to say I want to copy dot files out MD – dot dot slash food MD sure food MD and now if I do LS dot you’ll see that there’s a food MD file in that directory so CP as well take two paths it does not have to be in the same directory and similarly there’s the RM command which lets you remove a file and there – you can give paths in this case I’m removing dot dot slash food you should be aware for removing especially on Linux removal is by default not recursive so you cannot remove a directory using RM you can pass the – our flag which lets you do a recursive remove and then give a path that you want to remove and it will remove everything below it there is also the RM dr dir command which lets you remove a directory but it only lets you remove that directory if it is empty so the idea here is to sort of be a safety mechanism for you so you don’t accidentally throw away a bunch of your files and the final little command that’s handy to use is make there which lets you create a new directory and as we talked about before you don’t want to do something like this because it will create two directories for you one called my and one called photos if you actually want to create a directory like this you would either escape the space or quote the string if you ever want more information about how any command to basically on these platforms work there’s a really handy command for that as well there is the program called man for manual pages this program takes as an argument the name of another program and gives you its manual page so for example we could do man LS and this shows us a manual page for LS you’ll notice that in the case of LS it is fairly similar to what we got with LS – help but it’s a little easier to navigate a little easier to read usually towards the bottom you will also get examples information about who wrote it where you can find more information and that sort of stuff one thing that can be confusing sometimes at least until a recent version where they added this three at the bottom which says Q to quit they do not use to say this you press Q to quit this program it can be really hard to quit it if you do not know that a handy keyboard shortcut here by the way is ctrl L which lets you clear your terminal and go back to the top so so far we’ve only talked about programs in isolation but where much of the power of the shell really comes through is once you start combining different programs right so rather than just like running CDE running LS and etc you might want to chain multiple programs together you might want to interact with files and have files operate in between programs and the way we can do this is using this notion of streams that the shell gives us every program by default has I’m gonna simplify a little and say two primary streams it has an input stream and an output stream by default the input stream is your keyboard basically the input stream is your terminal and whatever you type into your terminal is going to end up into the program and it has a default output stream which is whenever the program prints something it’s gonna print to that stream and by default that is also your terminal this is why when I type echo hello it gets printed back to my terminal but the shell gives you a way to rewire these streams to change where the input output of a programmer pointed the way the most straightforward way you do this is using the angle bracket signs so you can write something like this or you can write something like this the left angle bracket indicates rewire the input for this program to be the contents of this file and the end angle bracket means rewire the output of the preceding program into this file so let’s look at an example of what that would look like if I do echo hello I can say I want that context the content to be stored in a file called hello dot text and because I gave this is a relative path right this will construct a file in the current directory called hello text and at least in theory its contents should be the word hello so if I run this notice that nothing got printed to my output the previous time when I ran echo hello it printed hello now that hello is going gone into a file called hello text and I can verify this

by using the program called cat so cat prints the contents of a file so I can do cat hello dot txt and there it shows me hello but cat is a is also something that supports this kind of wiring so I can say cat which by default just prints its input it just duplicates its input to its output I can say I want you to take your input from Hello text what will happen in this case is that the shell is going to open hello dot txt take its contents and set that to be the input of cat and then cat is going to just print that to its output which since I haven’t rewired it is gonna be my terminal so this will just print hello to the output and I can use both of these at the same time so for example if I want to copy a file and I don’t want to use the CP command for some reason I can do this and in this case I’m telling the cat program nothing at all I’m just saying do your normal thing right the cat program does not know anything about this redirection but I’m telling the shell to use hello dot txt as the input for cat and to write anything that cat prints – hello – dot txt again this prints nothing to my terminal but if cat hello to text I get the output as I would have expected which is a copy of the original file there is also a double end bracket which is append instead of just overwrite so you’ll notice that I if I do cat hello dot txt – hello – dot txt again and then I cat hello2 dot txt it still just contains hello even though it already contained hello if I switch that to instead be a double end bracket it means append and if I now cat that file it has a hello twice these are pretty straightforward they’re usually just ways to interact with files but where it gets really interesting is an additional operator the shell gives you called the pipe character so pipe is just a vertical bar and what pipe means is take the output of the program to the left and make it the input of the program to the right right so what does this look like well let’s take the example of ls / or ls dash l / this prints a bunch of things let’s say that I only wanted the last line of this output well there’s a command called tail and tail prints the last n lines of its input and I can do -n1 so this is a flag called n you can also use dash dash lines if you want to use it as a longer option but in this case this is saying just print the last line and I can wire these together so I can say ls dash l / pipe tail -n1 and notice here that ls does not know about tail and tail does not know about ls they are different programs and have never been programmed to be compatible with one another all they know how to do is read from input and write to output and then the pipe is what wires them together and in this particular case I’m saying I want the output of LS to be the input to tail and then I want the output of tail to just go to my terminal because I haven’t rewired it I could also rewire this to say I want the output to go to ls dot text and in this case if I cat ls dot text I would get the appropriate output and it turns out you can do some really neat things with this gonna cover this a lot more in the data wrangling lecture there will be in like four days or something on the kind of fancy stuff you can do when you start building more advanced pipelines one to give you one example we can do something like curl – -head –silent google.com so just to show you what that looks like this gives me all the HTTP headers for accessing google.com and I can pipe that to grep a – like a –ignore-case or just -i if I want content length so this is gonna print the content length header, grep is a program that we’ll talk about later they’ll let you search in an input stream for a given keyword we can pipe that through say the cut command which takes a delimiter set that to be space and I want the second field and this prints just the content length this is sort of a silly example right like this just lets you extract the content length in bytes of google.com from the command line it’s not a very useful thing to do but you can see how by chaining these together you can achieve a bunch of really interesting text manipulation effects and it turns out pipes are not just for textual data you can do this for things like images as well you can have a program that manipulates a binary image on its input and writes a binary image to its output and you can chain them together in this way and we’ll talk about some of those kinds of examples later on – you can even do this for video if you want you can stream this is

for example a great way if you have a chromecast at home you can stream a video file like this by having the last program in your pipe be a chromecast send program so you stream a video file into it and it streams or HTTP to your chromecast we’ll take we’ll talk a lot more about this in the data wrangling lecture but there’s one more thing that I wanted to talk to you about about sort of how to use the terminal and a more interesting and perhaps more powerful way that you might be used to and this is perhaps even going to be interesting for the ones of you who feel like you’re already comfortable with the term but first we need to cover a important topic when it comes to Linux systems and Mac OS systems in particular which is the notion of the root user the root user is sort of like the administrator user on Windows and it has user IDs zero the root user is special because it is allowed to do whatever it wants on your system even if a file is like not readable by anyone or if it’s not writable by anyone root can still access that file root is sort of a super user that gets to do whatever they want and most of the time you will not be operating as the super user you will not be root you will be a user like John or whatever your name is and that’s going to be the user you act with because if you were operating your computer as the root user at all times if you ran the wrong program they could just completely destroy your computer and you don’t want that right but every now and again you want to do something that requires that you are root usually for these cases you will use a program called sudo su do or do as su and su in this case is Super User so this is a way to do the following thing as the super user usually the way sudo works is you write sudo and then a command like you would normally on your terminal and it will just run that command as if you were root as opposed to the user you actually are where might you need something like this well there is a special there are many special file system on your computer but in particular there’s one called sysfs if you CD to slash sys this is a whole new world this file system is are not actually files on your computer instead these are various kernel parameters so the kernel is like basically the the core of your computer this is a way for you to access various kernel parameters through what looks like a file system you’ll see here that if I CD into class for example it has directories for a bunch of different types of devices that I can interact with or various queues I can access or all sorts of weird knobs internally and because they’re exposed as files it means we can also use all the tools have been using so far in order to manipulate them one example of this is if you go into sys class backlight so this backlight directly and lets you configure the backlight on your laptop if you have one so I can CD in to intel backlight this is an Intel laptop inside here you’ll see there’s a file called brightness and I can cat the brightness this is the current brightness of my screen but not only that I can modify this too in order to change the brightness of my screen so you might think that I could do let’s see what the max brightness is here okay so it’s currently set to the max brightness you might imagine that I could do something like if I do echo let’s do half or something echo 500 to brightness if I do this it says permission denied I’m not allowed to modify brightness because in order to basically in order to change things in the kernel you need to be the administrator and you might imagine that the way to solve this is to write sudo echo 500 but I still get a permission denied error but why is that it’s because as I mentioned before these redirections of input and output is not something the programs know about when we piped Elison to tail tail did not know about LS and LS did not know about tail the pipe and the redirection was set up by the shell so in this case what’s happening is I’m telling my shell run the program sudo with the arguments echo and 500 and send its output to the file called brightness but the shell is what is opening the brightness file it is not the sudo program so in this case the shell which is running as me tries to open the brightness file for writing and it’s not allowed to do that and therefore I get a permission down error you might have seen this if you like search for something end up on Stack Overflow and it tells just run this command and you’ll see that it does something like they give you instructions like one two sis what’s an example net ipv4 for word for example this is something you may have seen if

you’re setting up a firewall and this command is intended to work because this little pound symbol indicates run this as root this is something that is very rarely explained but that is what the pound symbol means you’ll see on my prompt there’s a dollar symbol instead and the dollar indicates you are not running as root so the question is how do I get around this well I could switch into a root terminal so one way to do this is to run sudo su sudo su is saying run the following command s root and su is a complicated command that effectively gets you a shell as the super user so if I do this type of password then now you’ll see that the username at the beginning changed from jon to root and the prompt changed from a dollar to a pound if I now I come in to that file if I do echo 500 to brightness my screen got a little dimmer but you can’t see it you just have to trust me and now I didn’t get an error and this is because the shell is now running as root it is not running as Jon and the root user is allowed to open this file but given our knowledge that we have of the terminal now there’s actually a way for us to do this without having to drop to a root shell and that is as follows that’s I guess restore it to 1060 so do you see why this is different here I’m telling my shell to run the echo 1060 command which is gonna echo 1060 and I’m telling it to run the sudo tee brightness command and I’m telling you to send the output of echo into sudo tee in order to understand this you need to know what the tee command does the tee command takes its input and writes it to a file but also to standard out so tee is a convenient way if you have say a log file that you want to like send to a file to store for later but you also want to see it to yourself then you can pipe it through tee give it the name of a file and it will write whatever its input is both to that file and to your screen and here I’m taking advantage of that program I’m saying run tee as route and have tee right into the brightness file and so in this case the tee program which is what is opening the brightness file is running as root and so it is allowed to do if I run this it will now again you can’t see but the brightness and I’ve been turned on by a laptop and I don’t get any errors and I never had to drop into a root shell and run commands there which can often be somewhat dangerous if you want to explore this filesystem a little bit more there’s a lot of interesting stuff in here if you just sort of start browsing around you can find all sorts of fun things so for example we noticed that there was a fun brightness command here I wonder what other kinds of brightness I can set so I can use the find command which we will also talk about in a coming lecture I wouldn’t look on any file whose name it’s a little like brightness in the current directory that’s unhelpful maybe they’re not files did I misspell brightness yeah why is it being annoying Oh apparently it does not want to search for brightness for me how well luckily for you I know of one already handy that there is a subdirectory called LEDs and LEDs have brightness too what kind of LEDs are there ooh lots of things for example the scroll lock led now most of you probably don’t know what the scroll lock LED is or much less what scroll lock is you might have seen a key on your keyboard neighbor named scroll lock basically no one knows what it means anymore no one really uses it for anything it’s mostly just a dead key and also a dead LED what if you wanted to configure it so that every time you get email your scroll lock LED lights up because there’s no other reason why it would light up well if we seed you into this particular directory that has a brightness place and it’s set to zero well what happens if I write one into it you probably should not just be writing random numbers into random files in this directory because you are affecting your kernel directly like look up what the files do in this particular case I have warned safety goggles and I’ve done my research so now you can’t tell but on my keyboard the scroll lock LED is now lit so now if I wrote a program that like did some checking of mail and stuff I could have it at the end run a program that echoes one into this file and now I have a way for my led to my keyboard to indicate when I’ve new email at this point you should know roughly your way around the terminal around the shell and and know enough to accomplish these basic tasks at least in theory now you

shouldn’t need to use like point-and-click interfaces to find files anymore there’s one remaining trick you might need and that is the ability to open a file so far I’ve only really given you ways to find files but one thing you should know about is missing semester xdg-open this will probably only work on Linux on Mac OS I think it’s just called open on Windows who knows xdg-open you give the name of a file and it will open it in the appropriate program so if you open if you do xdg-open an HTML file that will open your browser and open that file and once you have that program in theory you should no longer need to open like a Finder window ever again you might want to for other reasons but in theory you can accomplish at all using the tools that we’ve learned today this might all seem relatively basic for some of you but as I mentioned this is sort of the ramp-up period of now we all know how the shell works and a lot of what we’ll be doing in future lectures is using this knowledge to do really interesting things using the shell that sort of this is learning the the interface that we’re going to be using and so it’s important we all know it we’re gonna talk a lot more in the next lecture about how to automate tasks like this how to write scripts that run a bunch of programs for you and have to do things like conditionals and loops and stuff in your terminal and do things like run a program until it fails which can be handy in classes where you want to run something until your test suite fails for example so that’s the topic for next week’s lecture did you have a question it’s what you’ve been demoing this assist directory that presumably will only work if you’re running that is a good question I don’t know whether the windows subsystem for Linux will expose the sis file system if it does it probably only exposes a very small number of things it might because there are I don’t know check it out one thing you’ll see is the lecture notes for this lecture are already online and at the very bottom of the file there are a bunch of exercises some of them are relatively easy some of them are a little bit harder and what we encourage you to do is to take a stab at going through them if you know this stuff already it should go really quickly if you don’t it might teach you a bunch of things that you might not realize you didn’t know and for the office hours that we’re gonna do right after this lecture we will happily help you get through all of those or if there are other commands and you learn in the process you want to know how to use more efficiently and then in next lecture which is tomorrow will basically be assuming that you know the kind of stuff that the exercise is going to teach you there’s also a an email address on the website where you can send us questions if you think of something like after the office hours are finished are there any questions before we end today no no all right well we will have office hours on the ninth floor of the gates building of building 32 in like five minutes sweet see you there