CS 279 - Week 7 Lecture 2 - 2022-10-05

TODAY WE WILL
*   announcements
*   p.s. about exit statuses
*   standard files and redirection
*   initialization files!
*   alias command
*   prep for next class

*   turn in your at-least-first-attempts at Homework 4
    by 11:59 pm on Friday

=====
p.s. about exit statuses
=====
*   we mentioned how exit status of 0 is intended
    to be "successful completion", and non-zero
    not-so-successful

*   a bash shell -- interactive or in a shell script --
    can see the exit status of the last command run
    by looking at the value of of $?

=====
standard files and redirection
=====
*   Some UNIX/Linux commands, such as cat,
    will read their input from standard input
    unless you specify files explicitly

    and MANY write their output to standard output
    (as we know!)

*   We also know:
    you can redirect standard output to a file
    with >

    jobs > curr_jobs.txt

    and we can ask to append that redirected standard output
    using >>

    jobs >> curr_jobs.txt  # has 2 jobs' output included

*   you can redirect standard input to be from a file instead
    of from the keyboard with < followed by a filename

    ./input-redir-ex < looky.txt

*   standard error is another standard file!!
    *   by default, standard error is set to the screen
        as standard output is

    *   you can redirect standard error using
    	2> (followed by the file to write that to)

        cp * play 2> see-errors.txt

        ...and any errors, like trying to copy directory
	play to itself, are redirected to see-errors.txt instead
	of to the screen

        (and 2>> does append!

	cp * play 2>> see-errors.txt
        )

*   redirections have higher precedence than pipes

    *   FIRST the redirections are associated with commands,

        THEN the commands and their redirections are passed through
	the pipes

    $ grep "value" * 2> errors.txt | sort > looky.txt

*   filter: (in UNIX/Linux world): for a program that takes
    standard input data, transforms it, and produces standard output

    *   filter programs work great with pipes!!

======
file descriptors
======
*   each process has a numbered set of FILE DESCRIPTORS
    associated with it
    *   when a program reads from or writes to a file,
        it refers to that file by its descriptor

    *   three file descriptors are created when a process
        starts up:

	0 - standard input  (abbeviated stdin)
	1 - standard output (abbreviated stdout)
	2 - standard error (abbreviated stderr)

        ^ yes, that's where the 2 in 2> i comes from...

    *  every file descriptor is associated with a file --
       by default, file descriptors 0, 1, and 2 are associated
       with /dev/tty, which is your terminal (and keyboard?)
       unless you have modified them using redirection or pipes!

======
(shell) Initialization Files
======
*   these can vary based on UNIX/Linux distribution...
    (so, take this with a grain of salt!)

*   there are system-level initialization files,
    and each user can have their own personal initialization files

*   FOR EXAMPLE,
    /etc/profile
    *   starting an interactive shell, this will typically be invoked

    /etc/bashrc
    *   LDP "Bash Beginners Guide" says this will tend to
        contain Bash-specific configurations;
	and nrs-projects' /etc/profile include:

        "# System wide environment and startup programs, for login setup"
	[go in /etc/profile,]
        "# Functions and aliases go in /etc/bashrc"

    ~/.bash_profile
    *   this is a single user's Bash-specific configuration file

        LDP Bash Beginners Guide:
	...preferred configuration file for an individual's environment?
	...BUT frequently uses the source command to run .bashrc!

    ~/.bash_login
        LDP Bash Beginners Guide:

        *   contains settings normally executed only when you
	    log into a shell
	    
    ~/.bashrc

        LDP Bash Beginners Guide:
	*   this will be a sought when a non-login shell is
	    started

        *   I've seen the advice to put aliases and functions
	    here...?

        *   and the other .bash_* files often source this,
	    so both login and non-long see it

        if [ -f ~/.bashrc ]
	then
	    source ~/.bashrc
	fi

        *   FUN FACT: in the Bourne shell (and subsequent
	    shells) . starting a command means the same as source...!

=====
looking in additional directories for a command: adding to PATH
=====
*   the PATH environment variable specifies the directories to search to find
    command executables

*   you can ADD directories to this, such as a personal bin directory or the
    current working directory

*   the pathnames to be checked are SEPARATED by COLONS

*   ADD to this, do not completely reset it; you do not want to "lose" access
    to regular UNIX/Linux commands!

*   for example, to add a bin directory in your home directory to your 
    PATH (noting that HOME contains your home directory's path):

    export PATH=$PATH:$HOME/bin

*   for example, to add both a bin directory in your home directory and the
    current working directory to your path:

    export PATH=$PATH:$HOME/bin:.

=====
alias command
=====
LDP Bash Beginners Guide:
*   allows a string to be substituted for a word when it is
    used as the first word of a simple command

alias desired_alias="cmd it is an alias for"

*   users frequently put these in their .bashrc files in
   their home directory