Computers and Terminals

A brief overview of Terminal and Linux is a step on your way to becoming a Linux expert. When a computer boots up, a kernel (MacOS, Windows, Linux) is started. This kernel is the core of the operating system and manages hardware resources. Above the kernel, various applications run, including the shell and terminal, which allow users to interact with the system using a basic set of commands provided by the kernel.

Typically, casual users interact with the system through a Desktop User Interface (UI) that is started by the computer’s boot-up processes. However, to interact directly with the shell, users can run a “terminal” application through the Desktop UI. Additionally, VS Code provides the ability to activate a “terminal” within its editing environment, making it convenient for developers to execute commands without leaving the code editor.

In this next phase, we will use a Jupyter notebook to perform Linux commands through a terminal. The Jupyter notebook is an application that runs above the kernel, providing an interactive environment for writing and executing code, including shell commands. This setup allows us to seamlessly integrate code execution, data analysis, and documentation in one place, enhancing our productivity and learning experience.

Setup a Personal GitHub Pages Project

You will be making a personal copy of the course repository. Be sure to have a GitHub account!!!

In the next few code cells, we will run a bash (shell) script to pull a GitHub project.

Shell Script and Variables

We will ultimately run a bash (shell) script to pull a GitHub project. This next script simply sets up the necessary environment variables to tell the script the location of repository from GitHub and where to copy the output.

For now, focus on each line that begins with export. These are shell variables. Each line has a name (after the keyword export) and a value (after the equal sign).

Here is a full description:

By running this script, you will prepare your environment for cloning and working on your GitHub project. This is an essential step in setting up your development environment and ensuring that all dependencies are correctly configured.

%%script bash

# Dependency Variables, set to match your project directories

cat <<EOF > /tmp/variables.sh
export project_dir=$HOME/nighthawk  # change nighthawk to different name to test your git clone
export project=\$project_dir/adityacsastudent  # change adityacsastudent to name of project from git clone
export project_repo="https://github.com/nighthawkcoders/adityacsastudent.git"  # change to project you created from portfolio_2025 template 
EOF

Describing the Outputs of the Variables

The next script will extract the saved variables and display their values. Here is a description of the commands:

By running this script, you can verify that the environment variables are correctly set in your development environment. If they don’t match up, go back to the previous code cell and make the necessary corrections.

%%script bash

# Extract saved variables
source /tmp/variables.sh

# Output shown title and value variables
echo "Project dir: $project_dir"
echo "Project: $project"
echo "Repo: $project_repo"
Project dir: /home/adityasamavedam/nighthawk
Project: /home/adityasamavedam/nighthawk/adityacsastudent
Repo: https://github.com/nighthawkcoders/adityacsastudent.git

Project Setup and Analysis with Bash Scripts

The bash scripts that follow automate what was done in the Tools Installation procedures with regards to cloning a GitHub project. Doing this in a script fashion adds the following benefits:

Pull Code

Pull code from GitHub to your machine. This is a bash script, a sequence of commands, that will create a project directory and add the “project” from GitHub to the vscode directory. There is conditional logic to make sure that the clone only happens if it does not (!) exist. Here are some key elements in this code:

Run the script two times and you will see that the output changes. In the second run, the files exist and it impact the flow of the code.

%%script bash

# Extract saved variables
source /tmp/variables.sh

echo "Using conditional statement to create a project directory and project"

cd ~    # start in home directory

# Conditional block to make a project directory
if [ ! -d $project_dir ]
then 
    echo "Directory $project_dir does not exist... making directory $project_dir"
    mkdir -p $project_dir
fi
echo "Directory $project_dir exists." 

# Conditional block to git clone a project from project_repo
if [ ! -d $project ]
then
    echo "Directory $project does not exist... cloning $project_repo"
    cd $project_dir
    git clone $project_repo
    cd ~
fi
echo "Directory $project exists."
Using conditional statement to create a project directory and project
Directory /home/adityasamavedam/nighthawk exists.
Directory /home/adityasamavedam/nighthawk/adityacsastudent does not exist... cloning https://github.com/nighthawkcoders/adityacsastudent.git


Cloning into 'adityacsastudent'...

Look at Files in GitHub Project

All computers contain files and directories. The clone brought more files from the cloud to your machine. Review the bash shell script, observe the commands that show and interact with files and directories. These were used during setup.

%%script bash

# Extract saved variables
source /tmp/variables.sh

echo "Navigate to project, then navigate to area wwhere files were cloned"
cd $project
pwd

echo ""
echo "list top level or root of files with project pulled from github"
ls

Navigate to project, then navigate to area wwhere files were cloned
/home/adityasamavedam/nighthawk/adityacsastudent

list top level or root of files with project pulled from github

Look at File List with Hidden and Long Attributes

Most Linux commands have options to enhance behavior. The enhanced listing below shows permission bits, owner of the file, size, and date.

Some useful ls flags:

ls reference

%%script bash

# Extract saved variables
source /tmp/variables.sh

echo "Navigate to project, then navigate to area wwhere files were cloned"
cd $project
pwd

echo ""
echo "list all files in long format"
ls -al   # all files -a (hidden) in -l long listing
Navigate to project, then navigate to area wwhere files were cloned
/home/adityasamavedam/nighthawk/adityacsastudent

list all files in long format
total 12
drwxr-xr-x 3 adityasamavedam adityasamavedam 4096 Sep 10 11:54 .
drwxr-xr-x 4 adityasamavedam adityasamavedam 4096 Sep 10 11:54 ..
drwxr-xr-x 7 adityasamavedam adityasamavedam 4096 Sep 10 11:54 .git
%%script bash

# Extract saved variables
source /tmp/variables.sh

echo "Look for posts"
export posts=$project/_posts  # _posts inside project
cd $posts  # this should exist per fastpages
pwd  # present working directory
ls -lR  # list posts recursively
Look for posts
/home/adityasamavedam/csa/adityacsastudent/_notebooks/Foundation/B-tools_and_equipment


bash: line 7: cd: /home/adityasamavedam/nighthawk/adityacsastudent/_posts: No such file or directory


.:
total 116
-rw-r--r-- 1 adityasamavedam adityasamavedam  9767 Sep  9 23:14 2023-08-19-devops_accounts.ipynb
-rw-r--r-- 1 adityasamavedam adityasamavedam  5931 Sep  9 23:14 2023-08-21-devops_tools-home.ipynb
-rw-r--r-- 1 adityasamavedam adityasamavedam 22875 Sep  9 23:18 2023-08-21-devops_tools-setup.ipynb
-rw-r--r-- 1 adityasamavedam adityasamavedam 24802 Sep 10 11:55 2023-08-22-devops_tools-verify.ipynb
-rw-r--r-- 1 adityasamavedam adityasamavedam 32309 Sep  9 23:14 2023-08-23-devops-githhub_pages-play.ipynb
-rw-r--r-- 1 adityasamavedam adityasamavedam  9482 Sep  9 23:18 2023-08-23-devops-hacks.ipynb
%%script bash

# Extract saved variables
source /tmp/variables.sh

echo "Look for notebooks"
export notebooks=$project/_notebooks  # _notebooks is inside project
cd $notebooks   # this should exist per fastpages
pwd  # present working directory
ls -lR  # list notebooks recursively
Look for notebooks


bash: line 7: cd: /home/adityasamavedam/nighthawk/adityacsastudent/_notebooks: No such file or directory


/home/adityasamavedam/csa/adityacsastudent/_notebooks/Foundation/B-tools_and_equipment
.:
total 116
-rw-r--r-- 1 adityasamavedam adityasamavedam  9767 Sep  9 23:14 2023-08-19-devops_accounts.ipynb
-rw-r--r-- 1 adityasamavedam adityasamavedam  5931 Sep  9 23:14 2023-08-21-devops_tools-home.ipynb
-rw-r--r-- 1 adityasamavedam adityasamavedam 22875 Sep  9 23:18 2023-08-21-devops_tools-setup.ipynb
-rw-r--r-- 1 adityasamavedam adityasamavedam 25998 Sep 10 11:55 2023-08-22-devops_tools-verify.ipynb
-rw-r--r-- 1 adityasamavedam adityasamavedam 32309 Sep  9 23:14 2023-08-23-devops-githhub_pages-play.ipynb
-rw-r--r-- 1 adityasamavedam adityasamavedam  9482 Sep  9 23:18 2023-08-23-devops-hacks.ipynb
%%script bash

# Extract saved variables
source /tmp/variables.sh

echo "Look for images, print working directory, list files"
cd $project/images  # this should exist per fastpages
pwd
ls -lR
Look for images, print working directory, list files
/home/adityasamavedam/csa/adityacsastudent/_notebooks/Foundation/B-tools_and_equipment


bash: line 6: cd: /home/adityasamavedam/nighthawk/adityacsastudent/images: No such file or directory


.:
total 116
-rw-r--r-- 1 adityasamavedam adityasamavedam  9767 Sep  9 23:14 2023-08-19-devops_accounts.ipynb
-rw-r--r-- 1 adityasamavedam adityasamavedam  5931 Sep  9 23:14 2023-08-21-devops_tools-home.ipynb
-rw-r--r-- 1 adityasamavedam adityasamavedam 22875 Sep  9 23:18 2023-08-21-devops_tools-setup.ipynb
-rw-r--r-- 1 adityasamavedam adityasamavedam 27203 Sep 10 11:55 2023-08-22-devops_tools-verify.ipynb
-rw-r--r-- 1 adityasamavedam adityasamavedam 32309 Sep  9 23:14 2023-08-23-devops-githhub_pages-play.ipynb
-rw-r--r-- 1 adityasamavedam adityasamavedam  9482 Sep  9 23:18 2023-08-23-devops-hacks.ipynb

Look inside a Markdown File

“cat” reads data from the file and gives its content as output

%%script bash

# Extract saved variables
source /tmp/variables.sh

echo "Navigate to project, then navigate to area wwhere files were cloned"

cd $project
echo "show the contents of README.md"
echo ""

cat README.md  # show contents of file, in this case markdown
echo ""
echo "end of README.md"

Navigate to project, then navigate to area wwhere files were cloned
show the contents of README.md



cat: README.md: No such file or directory



end of README.md

Env, Git, and GitHub

Env(ironment) is used to capture things like the path to the Code or Home directory. Git and GitHub are not only used to exchange code between individuals but are also often used to exchange code through servers, in our case for website deployment. All tools we use have behind-the-scenes relationships with the system they run on (MacOS, Windows, Linux) or a relationship with servers to which they are connected (e.g., GitHub). There is an “env” command in bash. There are environment files and setting files (e.g., .git/config) for Git. They both use a key/value concept.

%%script bash

# This command has no dependencies

echo "Show the shell environment variables, key on left of equal value on right"
echo ""

env
Show the shell environment variables, key on left of equal value on right

SHELL=/bin/bash
PYTHONUNBUFFERED=1
WSL2_GUI_APPS_ENABLED=1
APPLICATION_INSIGHTS_NO_DIAGNOSTIC_CHANNEL=1
WSL_DISTRO_NAME=Ubuntu-24.04
PYTHON_FROZEN_MODULES=on
ELECTRON_RUN_AS_NODE=1
RBENV_SHELL=bash
VSCODE_AMD_ENTRYPOINT=vs/workbench/api/node/extensionHostProcess
NAME=Aditya-Laptop
PWD=/home/adityasamavedam/csa/adityacsastudent/_notebooks/Foundation/B-tools_and_equipment
LOGNAME=adityasamavedam
PYDEVD_IPYTHON_COMPATIBLE_DEBUGGING=1
MOTD_SHOWN=update-motd
HOME=/home/adityasamavedam
LANG=C.UTF-8
WSL_INTEROP=/run/WSL/834612_interop
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=00:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.avif=01;35:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:*~=00;90:*#=00;90:*.bak=00;90:*.crdownload=00;90:*.dpkg-dist=00;90:*.dpkg-new=00;90:*.dpkg-old=00;90:*.dpkg-tmp=00;90:*.old=00;90:*.orig=00;90:*.part=00;90:*.rej=00;90:*.rpmnew=00;90:*.rpmorig=00;90:*.rpmsave=00;90:*.swp=00;90:*.tmp=00;90:*.ucf-dist=00;90:*.ucf-new=00;90:*.ucf-old=00;90:
VIRTUAL_ENV=/home/adityasamavedam/csa/adityacsastudent/venv
WAYLAND_DISPLAY=wayland-0
FORCE_COLOR=1
PYDEVD_USE_FRAME_EVAL=NO
CLICOLOR=1
VSCODE_L10N_BUNDLE_LOCATION=
CLICOLOR_FORCE=1
LESSCLOSE=/usr/bin/lesspipe %s %s
VSCODE_HANDLES_SIGPIPE=true
TERM=xterm-color
LESSOPEN=| /usr/bin/lesspipe %s
USER=adityasamavedam
GIT_PAGER=cat
PYTHONIOENCODING=utf-8
DISPLAY=:0
SHLVL=1
PAGER=cat
VSCODE_CWD=/mnt/c/Users/Aditya/AppData/Local/Programs/Microsoft VS Code
VIRTUAL_ENV_PROMPT=(venv) 
MPLBACKEND=module://matplotlib_inline.backend_inline
XDG_RUNTIME_DIR=/run/user/1002/
DEBUGINFOD_URLS=https://debuginfod.ubuntu.com 
WSLENV=VSCODE_WSL_EXT_LOCATION/up
VSCODE_WSL_EXT_LOCATION=/mnt/c/Users/Aditya/.vscode/extensions/ms-vscode-remote.remote-wsl-0.88.2
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
PATH=/home/adityasamavedam/csa/adityacsastudent/venv/bin:/home/adityasamavedam/.vscode-server/bin/4849ca9bdf9666755eb463db297b69e5385090e3/bin/remote-cli:/home/adityasamavedam/.local/bin:/home/adityasamavedam/.rbenv/shims:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/wsl/lib:/mnt/c/WINDOWS/system32:/mnt/c/WINDOWS:/mnt/c/WINDOWS/System32/Wbem:/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/:/mnt/c/WINDOWS/System32/OpenSSH/:/mnt/c/Program Files/dotnet/:/mnt/c/Program Files/PuTTY/:/mnt/c/Users/Aditya/AppData/Local/Microsoft/WindowsApps:/mnt/c/Program Files/JetBrains/PyCharm Community Edition 2022.3/bin:/mnt/c/Users/Aditya/AppData/Local/Programs/Microsoft VS Code/bin:/snap/bin
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1002/bus
VSCODE_NLS_CONFIG={"userLocale":"en","osLocale":"en","resolvedLanguage":"en","defaultMessagesFile":"/home/adityasamavedam/.vscode-server/bin/4849ca9bdf9666755eb463db297b69e5385090e3/out/nls.messages.json","locale":"en","availableLanguages":{}}
HOSTTYPE=x86_64
PULSE_SERVER=unix:/mnt/wslg/PulseServer
VSCODE_HANDLES_UNCAUGHT_ERRORS=true
VSCODE_IPC_HOOK_CLI=/run/user/1002/vscode-ipc-d6efb1cf-43c9-4738-b8f5-11d9fde02e6d.sock
_=/usr/bin/env
%%script bash

# Extract saved variables
source /tmp/variables.sh

cd $project

echo ""
echo "show the secrets of .git config file"
cd .git
ls -l config

echo ""
echo "look at config file"
cat config
show the secrets of .git config file
-rw-r--r-- 1 adityasamavedam adityasamavedam 173 Sep 10 11:54 config

look at config file
[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
[remote "origin"]
	url = https://github.com/nighthawkcoders/adityacsastudent.git

Advanced Shell project

This example was requested by a student (Jun Lim, CSA). The request was to make a Jupyter file using bash; I adapted the request to markdown. This type of thought will have great extrapolation to coding and possibilities of using Lists, Arrays, or APIs to build user interfaces. JavaScript is a language where building HTML is very common.

To get more interesting output from the terminal, this will require using something like mdless (https://github.com/ttscoff/mdless). This enables seeing markdown in rendered format.

Output of the example is much nicer in “Jupyter”

This is starting the process of documentation.

%%script bash

# This example has an error in VSCode; it runs best on Jupyter
cd /tmp

file="sample.md"
if [ -f "$file" ]; then
    rm $file
fi

# Create a markdown file using tee and here document (<<EOF)
tee -a $file >/dev/null <<EOF
# Show Generated Markdown
This introductory paragraph and this line and the title above are generated using tee with the standard input (<<) redirection operator.
- This bulleted element is still part of the tee body.
EOF

# Append additional lines to the markdown file using echo and redirection (>>)
echo "- This bulleted element and lines below are generated using echo with standard output (>>) redirection operator." >> $file
echo "- The list definition, as is, is using space to separate lines. Thus the use of commas and hyphens in output." >> $file

# Define an array of actions and their descriptions
actions=("ls,list-directory" "cd,change-directory" "pwd,present-working-directory" "if-then-fi,test-condition" "env,bash-environment-variables" "cat,view-file-contents" "tee,write-to-output" "echo,display-content-of-string" "echo_text_>\$file,write-content-to-file" "echo_text_>>\$file,append-content-to-file")

# Loop through the actions array and append each action to the markdown file
for action in ${actions[@]}; do
  action=${action//-/ }  # Convert dash to space
  action=${action//,/: } # Convert comma to colon
  action=${action//_text_/ \"sample text\" } # Convert _text_ to "sample text", note escape character \ to avoid "" having meaning
  echo "    - ${action//-/ }" >> $file  # Append action to file
done

echo ""
echo "File listing and status"
ls -l $file # List file details
wc $file   # Show word count
mdless $file  # Render markdown from terminal (requires mdless installation)

rm $file  # Clean up temporary file
File listing and status
-rw-r--r-- 1 adityasamavedam adityasamavedam 808 Sep 10 11:55 sample.md
 15 132 808 sample.md


Show Generated Markdown ======================================================

This introductory paragraph and this line and the title above are generated using tee with the standard input (<<) redirection operator.

 * This bulleted element is still part of the tee body.
 * This bulleted element and lines below are generated using echo with standard output (>>) redirection operator.
 * The list definition, as is, is using space to separate lines. Thus the use of commas and hyphens in output.
   * ls: list directory
   * cd: change directory
   * pwd: present working directory
   * if then fi: test condition
   * env: bash environment variables
   * cat: view file contents
   * tee: write to output
   * echo: display content of string
   * echo "sample text" >$file: write content to file
   * echo "sample text" >>$file: append content to file



Display Shell commands help using man

The previous example used a markdown file to store a list of actions and their descriptions. This example uses the man command to generate a markdown file with descriptions of the commands. The markdown file is then displayed using mdless.

In coding, we should try to get data from the content creators instead of creating it on our own. This approach has several benefits:

%%script bash

# This example has an error in VSCode; it runs best on Jupyter
cd /tmp

file="sample.md"
if [ -f "$file" ]; then
    rm $file
fi

# Set locale to C to avoid locale-related errors
export LC_ALL=C

# Create a markdown file using tee and here document (<<EOF)
tee -a $file >/dev/null <<EOF
# Show Generated Markdown
This introductory paragraph and this line and the title above are generated using tee with the standard input (<<) redirection operator.
- This bulleted element is still part of the tee body.
EOF

# Append additional lines to the markdown file using echo and redirection (>>)
echo "- This bulleted element and lines below are generated using echo with standard output (>>) redirection operator." >> $file
echo "- The list definition, as is, is using space to separate lines. Thus the use of commas and hyphens in output." >> $file

# Define an array of commands
commands=("ls" "cat" "tail" "pwd" "env" "grep" "awk" "sed" "curl" "wget")

# Loop through the commands array and append each command description to the markdown file
for cmd in ${commands[@]}; do
  description=$(man $cmd | col -b | awk '/^NAME/{getline; print}')
  echo "    - $description" >> $file
done

echo ""
echo "File listing and status"
ls -l $file # List file details
wc $file   # Show word count
mdless $file  # Render markdown from terminal (requires mdless installation)

rm $file  # Clean up temporary file
troff:<standard input>:1039: warning [p 9, 0.2i]: cannot adjust line
troff:<standard input>:1296: warning [p 11, 5.2i]: cannot adjust line
troff:<standard input>:254: warning [p 3, 3.7i]: cannot adjust line
troff:<standard input>:583: warning [p 6, 0.2i]: cannot adjust line
troff:<standard input>:645: warning [p 6, 6.5i]: cannot adjust line
troff:<standard input>:664: warning [p 6, 8.7i]: cannot adjust line
troff:<standard input>:728: warning [p 7, 4.5i]: cannot adjust line
troff:<standard input>:746: warning [p 7, 6.3i]: cannot adjust line
troff:<standard input>:784: warning [p 8, 0.0i]: cannot adjust line
troff:<standard input>:1138: warning [p 11, 3.5i]: cannot adjust line
troff:<standard input>:1414: warning [p 13, 6.2i]: cannot adjust line
troff:<standard input>:1415: warning [p 13, 6.5i]: cannot adjust line
troff:<standard input>:1471: warning [p 13, 12.3i]: cannot adjust line
troff:<standard input>:1652: warning [p 15, 0.0i]: cannot adjust line
troff:<standard input>:1652: warning [p 15, 0.2i]: cannot adjust line
troff:<standard input>:1652: warning [p 15, 0.3i]: cannot adjust line
troff:<standard input>:1746: warning [p 15, 10.3i]: cannot adjust line
troff:<standard input>:1794: warning [p 16, 0.7i]: cannot adjust line
troff:<standard input>:1794: warning [p 16, 0.8i]: cannot adjust line
troff:<standard input>:1794: warning [p 16, 1.0i]: cannot adjust line
troff:<standard input>:1936: warning [p 16, 13.5i]: cannot adjust line
troff:<standard input>:1956: warning [p 17, 1.7i]: cannot adjust line
troff:<standard input>:1956: warning [p 17, 1.8i]: cannot adjust line
troff:<standard input>:2409: warning [p 20, 7.5i]: cannot adjust line
troff:<standard input>:526: warning [p 9, 5.2i]: cannot break line
troff:<standard input>:2226: warning [p 36, 9.0i]: cannot adjust line
troff:<standard input>:2261: warning [p 37, 3.2i]: cannot adjust line
troff:<standard input>:2559: warning [p 42, 0.3i]: cannot break line



File listing and status
-rw-r--r-- 1 adityasamavedam adityasamavedam 1016 Sep 10 11:55 sample.md
  15  159 1016 sample.md


Show Generated Markdown ======================================================

This introductory paragraph and this line and the title above are generated using tee with the standard input (<<) redirection operator.

 * This bulleted element is still part of the tee body.
 * This bulleted element and lines below are generated using echo with standard output (>>) redirection operator.
 * The list definition, as is, is using space to separate lines. Thus the use of commas and hyphens in output.
   * ls - list directory contents
   * cat - concatenate files and print on the standard output
   * tail - output the last part of files
   * pwd - print name of current/working directory
   * env - run a program in a modified environment
   * grep,  egrep,  fgrep,  rgrep  -    print  lines  that match
   * gawk - pattern scanning and processing language
   * sed - stream editor for filtering and transforming text
   * curl - transfer a URL
   * Wget - The non-interactive network downloader.