mobilege / Linux Documentation tldr
$ which python3 # Shows first matching executable in PATH
$ which -a python3 # Shows all matching executables in PATH
$ where python3 # Same as 'which -a' but also includes aliases and built-ins
$ file /usr/bin/python3 # Describes the file type$ which python3
$ file $(!!)pwd Print name of current working directory
cd Change directory
$ cd . # Stay in the current directory
$ cd .. # Change to the parent directory
$ cd ~ # Change to the user's home directory
$ cd / # Navigate to the root directory
$ cd - # Switch to the previous directoryls List directory contents
$ ls -a # Show all files and directories, including hidden ones
$ ls -h # Show file sizes in human-readable format
$ ls -l # Show contents in long formatsee: The Linux Command Line, Chap 2
$ cat filename.txt # Display the entire contents of a file
$ head -n 5 filename.txt # Display the first 5 lines of a file
$ tail -n 20 filename.txt # Display the last 20 lines of a file
$ vim filename.txt # Open a file in the Vim text editor (creates a new file if it doesn't exist)
$ nano filename.txt # Open a file in the Nano text editor (creates a new file if it doesn't exist)
$ code filename.txt # Open a file in Visual Studio Code (creates a new file if it doesn't exist)Sequence of topics is based on: Shell Features > P261
- Alternative shells:
- https://fishshell.com
> fish> fish_config(https://fishshell.com/docs/current/cmds/fish_config.html)
- https://www.nushell.sh
> nu
- https://fishshell.com
$ ls a* # Starts with a
$ ls [ab]* # Starts with a or b
$ ls ???? # 4 letter files or directories$ mkdir dir{A..E} # dirA dirB dirC dirD dirE
$ touch file{1..5}.txt # file1.txt file2.txt file3.txt file4.txt file5.txt
$ touch file{abc,def,xyz}.txt # fileabc.txt filedef.txt filexyz.txt$ export MYVAR=5
$ echo $MYVAR
$ printenv # Prints all environment variables$ echo $PATH # display current PATH environment variable
$ export PATH=$PATH:/new/path # add new directory in path PATH is essentially a : separated list of directories. When you execute a command, the shell searches through each of these directories, one by one, until it finds a directory where the executable exists. Source
which, type, command, whence, where, whereis, whatis, hash etc
$ which python3
# /usr/local/bin/python3
$ which -a python3
# /usr/local/bin/python3
# /usr/bin/python3$ alias # Lists all aliases
$ alias ll='ls -lG' # Creates a temporary alias
$ unalias ll # Remove an aliasTo make an alias permanent, add it to: ~/.bashrc or ~/.zshrc. Run source ~/.bashrc or source ~/.zshrc after. Source
$ echo "hello" > file1.txt # Create/overwrite file
$ echo "hello2" >> file1.txt # Append to file
$ mkdir existingdir 2> errors.txt # Errors$ ls -l ~ | headRedirecting Standard Input < isn't very common imo Source
Topics based on: How Linux Works2 > 15 Development Tools
# Start with main.c, util.c, util.h
$ cc main.c util.c #creates a.out
$ ./a.out #Hello, World.# Start with main.c, util.c, util.h
$ cc -c main.c #creates main.o
$ cc -c util.c #creates util.o
$ cc main.o util.o #creates a.out
$ ./app #Hello, World-onames output file-ccreates object file Compiler Options- Static library ends with
.a - Shared library ends with
.so
See: Modern C++ Course, Lecture 1: Build Systems (2021)
# Start with main.c, util.c, util.h
$ cat Makefile
# CC=gcc
# main: main.o util.o
$ make #creates main.o, util.o, main
$ ./main #Hello, World.See: https://www.linuxtopia.org/online_books/an_introduction_to_gcc/gccintro_16.html
- The Linux Command Line > 14. Package Management
- https://help.ubuntu.com/community/InstallingSoftware
- Ruby / Package Management
- an application which handles the downloading and installation of packages (can itself be treated as a package)
- can be categorized into two main types: operating system (OS) based package managers and language-specific package managers
- examples:
- Homebrew (macOS)
- APT, apt-get (Linux Debian-based)
- YUM, DNF (Linux Red Hat-based)
- RubyGems (Ruby)
- pip (Python)
- npm, Yarn (JavaScript)
- collection of files bundled into a single file
- everything that a particular program needs to run
- can be Source Package or Binary Package
- can depend of other packages (Package Dependencies)
- other software packages that a particular package relies on
- online storage location
- RubyGems is responsible for managing the installation and distribution of gems globally
- Bundler focuses on managing gem dependencies within a specific Ruby project
- installed in
/usr/local/Cellar/<program>/<version>/bin/<executable>- Eg.
/usr/local/Cellar/tree/2.0.1/bin/tree
- Eg.
- symlink in
usr/local/bin - symlink in
usr/local/opt
/usr/local/lib/node_modulesmodules that came with Node/usr/local/lib/node_modules/npm/node_modulesmodules installed by the user usingnpm- Eg.
ls -dl /usr/local/lib/node_modules/npm/node_modules/t*
- Eg.
~/.nvm/versions/node/{version}/lib/node_modules/if using node version manager (nvm)- Eg.
ls -dl /Users/rabinjoshi/.nvm/versions/node/v17.2.0/lib/node_modules/npm/node_modules/t*
- Eg.
Permissive: MIT, BSD, Apache
Copyleft: GPL
see: https://exygy.com/blog/which-license-should-i-use-mit-vs-apache-vs-gpl/
Shell is an interpreter that executes commands typed as strings.
SSH is a program used to login to a remote system.
Default terminal prompt is <user>@<host> <folder>.
# Login to a remote system using a password.
[user@host ~]$ ssh remoteuser@remotehost
# Login to a remote system using a public key.
[user@host ~]$ ssh -i mylab.pem remoteuser@remotehost
# Logout
[remoteuser@remotehost ~]$ exit # or Ctrl+D$ whoami # Displays user id$ file /etc/passwd # Determine file type.
$ cat /etc/passwd # Print and concatenate files.
$ head /etc/passwd # Output the first part of files.
$ tail /etc/passwd # Display the last part of a file.$ history # Command-line history.| Shortcut | Description |
|---|---|
| Ctrl+A | Jump to the beginning of the command line. |
| Ctrl+E | Jump to the end of the command line. |
| Ctrl+U | Clear from the cursor to the beginning of the command line. |
| Ctrl+K | Clear from the cursor to the end of the command line. |
| Ctrl+LeftArrow | Jump to the beginning of the previous word on the command line. |
| Ctrl+RightArrow | Jump to the end of the next word on the command line. |
$ pwd # Print name of current/working directory.
$ ls # List directory contents
$ ls -lah # long listing format, include hidden files, human-readable size
$ ls -R # recursive, include subdirectories
$ cd # Go to home
$ cd .. # Go to parent
$ cd - # Go to the previous
$ mkdir # Create directory, -p: nested
$ touch file1.txt # Create empty file
$ echo -n > file2.txt # Create empty file
$ cp -r dirA dirA # Copy directory & its contents
$ cp -r dirA/* dirB # Copy contents only
$ cp file1 dir # Copy file
$ mv dir1 dir2 # Move directory & its contents
$ mv dirA/* dirB # Move contents only
$ mv file1 dir # Move file
$ rm -r dir1 # Remove directory & its contents
$ rm -r dir1/* # Remove contents only
$ rm file1 # Remove fileThe Linux Command Line · Chapter 17: Searching for Files
$ ls a* # Starts with a
$ ls [ab]* # Starts with a or b
$ ls ???? # 4 letter files or directories
$ mkdir dir{A..E} # dirA dirB dirC dirD dirE
$ touch file{1..5}.txt # file1.txt file2.txt file3.txt file4.txt file5.txt$ id # Display user's ID (UID), group ID (GID) and groups to which they belong"Every file is owned by one user and one group, no more, no less." What are the implications of this? Source
$ ls -l file1 # view who owns the file (owner & group) and what they can do with it (read/write/execute)
$ ls -ld dir1 # view who owns the directory (owner & group) and what they can do with it (read/write/execute)# switch to root user, login shell
# root's password required
# root user's account may not have a valid password at all for security reasons, use sudo in that case
$ su -
# switch to user1, login shell
# user1's password required
$ su - <user1> # sudo is an alternative to su (because the root user's account may not have a valid password at all for security reasons)
# user's own password required (not the root's like in su)
# whether a user has sudo priviledges is determined by the /etc/sudoers file
$ sudo <some command>
# switch to root user WITHOUT needing the root's password
$ sudo su -Unlike Linux, MacOS does not have the same commands like useradd, usermod, and userdel for creating, modifying, and deleting user accounts. Same for groups.
$ chmod go-rw file1 # (Symbolic way) Remove read and write permission for group and other
$ chmod a+x file2 # (Symbolic way) Add execute permission for everyone
$ chmod 644 samplefile # (Numeric way) Set read and write permissions foruser, read permission for group and other
$ chmod 750 sampledir # (Numeric way) Set read, write, execute for user, read and execute for group, and no permission for other$ ps aux # List all running processes
$ top # Display dynamic real-time information about running processes$ jobs # Show status of all jobs
$ bg # Resume the most recently suspended job and run it in the background
$ bg %1 # Resume job '1' and run it in the background
$ fg # Bring most recently suspended background job to foreground
$ fg $1 # Bring job '1' to the foregroundShell warns user of suspended jobs when closed.
MacOS is based on BSD
$ echo "Hello World" # Print given arguments.
$ man <command> # q to exit
$ tldr <command>/etc/passwdinformation about users/etc/shadowinformation about passwords/etc/groupinformation about groups/etc/sudoersinformation about which users can sudo
Dates & Times1
$ date # Displays the system date
$ date -u # Displays the date in UTC (Coordinated Universal) time
$ cal # Displays a calendar for the current month
$ cal -3 # Displays previous, current and next month- Modern C++
YouTube Playlist - Unix Exercises
- The Missing Semester of Your CS Education
- Fish Tutorial
