bash-tutorial/bash_tutorial.org

19 KiB
Raw Blame History

bash commands

DONE work in bash tutorial

CLOCK: [2021-09-08 mié 18:52][2021-09-08 mié 19:22] => 0:30 CLOCK: [2021-09-04 sáb 16:04][2021-09-04 sáb 16:34] => 0:30 CLOCK: [2021-09-04 sáb 15:19][2021-09-04 sáb 15:49] => 0:30

Variables

System variables are stored in users environment

  • $PATH Finds the content of a variable ("PATH")
  • "env" variables defined in shell environment

Add directory to path

"Environment variables" in: Arch wiki

To add a directory to the PATH for local usage, put the following in "~/.bash_profile":

export PATH="${PATH}:/home/my_user/bin"

This will add the directory at the end of $PATH. To update the variable, re-login or source the file:

source ~/.bash_profile

Then check directories in "$PATH"

echo $PATH

Adding a new user

Check users that are logged

users
myuser

New user called "test"

sudo useradd -p -m test

The configuration file "useradd" sets options for this command:

sudo less /etc/default/useradd
# useradd defaults file for ArchLinux
# original changes by TomK
GROUP=users
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=no
(END)

PS: should use "sudo" to see the file. And less() or more() will show the file

The following file contains a list of fields about each user:

 head -4 /etc/passwd
root0:0::/root:/bin/bash
bin1:1::/:/sbin/nologin
daemon2:2::/:/sbin/nologin
mail8:12::/var/spool/mail:/sbin/nologin

PS: head() is used to show only the first four lines.

Describe hardware

Here using piping to show only the first four lines in the output

lshw | head -4
myuser
description: Computer
width: 64 bits
capabilities: smp vsyscall32

Execute stuffs

Streaming from terminal

To watch a stream use video player such as 'mpv' or 'vlc' that supports streaming And pass the streaming address as argument to the name of the media player

 mpv https://live0.emacsconf.org/main.webm

Run a bash script

Write script

After writing, save the file with '.sh' extension. This script will echo the words within quotes

  #!/bin/bash
  echo "Hellow hu-hu"
Hellow hu-hu

Option a: make it executable

Use the command "chmod" to change permissions for the file

 chmod +x script.sh

Then, execute

./script.sh

Option b: run from terminal

bash script.sh

Or

sh script.sh

PS: to execute the script from any place in the machine include the script in a directory that can be read from $PATH

Option c: run from graphical interface

Run R scripts

Write the script and save it. Then go to the directory where the script was saved and run this code from terminal

Rscript script.R

Manuals

To explore the manuals use the command man or info followed by the name of the function or program

man
What manual page do you want?
For example, try 'man man'.

Search for information about the manual interface within man

man man

Description of the system hierarchy

man hier

Showing only the first four lines of "info" interface

info | head -4
File: dir, Node: Top, This is the top of the INFO tree.
This is the Info main menu (aka directory node).
A few useful Info commands:

Search for info page about Bash shell features

info bash

The manuals can also be accessed from emacs using "M-x" (using the "meta" key or CTRL + x)

M-x info
M-x man
M-x woman

Show command history

history

The file can be found in the user home:

/home/user/.bash_history

Translators and dictionaries

Apertium translator

Installing in Parabola GNU-linux

sudo pacman -S apertium-eng-spa-git
sudo pacman -S apertium-lex-tools
sudo pacman -S apertium-viewer-2.5.3-1

Apertium can be used in the command line

echo Hola | apertium spa-eng
echo Hello | apertium eng-spa

The pipe operator "|" is used to pass the input to apertium

Files and directories

Create empty file

Create "file.txt" with command touch

touch file.txt

Create a file redirecting the shell output using ">" operator

echo I will put this text wthin a file > file2.txt

Redirect input, output and standard error

Everything in GNU systems is a file. The keyboard and the terminal are also a file. The keyboard is used for input and the terminal is used by commands as output.

The files can be found in directory "fd", which stands for file descriptor)

cd /dev/fd/
ls -l
total 0
lr-x—— 1 user user 64 dec 15 10:31 0 -> /tmp/babel-yl1RTd/ob-input-izpXuk
l-wx—— 1 user user 64 dec 15 10:31 1 -> pipe:[42063]
lr-x—— 1 user user 64 dec 15 10:31 17 -> /dev/pts/0
l-wx—— 1 user user 64 dec 15 10:31 2 -> /tmp/emacsA1M18o
  • standard input stream is bound to /dev/fd/0
  • standard output (stout) stream is bound to /dev/fd/1
  • standard errror (stderr) stream is bound to /dev/fd/2

During interaction a terminal gets written to stdin (dev/fd/0), which a command read. The command then do an action and writes the output (stout or stderr) where it will read by the terminal and is displayed to the user.

To redirect use the operator `>` as follows:

  • `command > file_to_redirect`

The operator `>` redirects stout, i.e., is the same that 1>. This code creates a new file with the list of files present in the actual directory:

ls -l > file_redirect.txt
cat file_redirect.txt
total 32
-rw-rr 1 user user 15782 dec 15 10:49 bash_tutorial.org
-rw-rr 1 user user 0 dec 15 10:49 file_redirect.txt
-rw-rr 1 user user 11895 dec 9 17:44 markdown.md
-rw-rr 1 user user 121 dec 9 17:17 README.org

Use "2>&1" to redirect stderr with the stout. Using an arbitrary word and redirect it to the file should print a warning message that is redirected to the file:

ls -l > file_redirect.txt
paco >> file_redirect.txt 2>&1
cat file_redirect.txt
total 32
-rw-rr 1 user user 15995 dec 15 12:39 bash_tutorial.org
-rw-rr 1 user user 0 dec 15 13:41 file_redirect.txt
-rw-rr 1 user user 11895 dec 9 17:44 markdown.md
-rw-rr 1 user user 121 dec 9 17:17 README.org
bash: line 2: paco: command not found

Use the "<" operator to pass commands to the file:

ls -l > file_redirect.txt
paco >> file_redirect.txt 2>&1
sort < file_redirect.txt
cat file_redirect.txt
bash: line 2: paco: command not found
-rw-rr 1 user user 0 dec 15 13:44 file_redirect.txt
-rw-rr 1 user user 121 dec 9 17:17 README.org
-rw-rr 1 user user 16501 dec 15 13:41 bash_tutorial.org
total 24
total 24
-rw-rr 1 user user 16501 dec 15 13:41 bash_tutorial.org
-rw-rr 1 user user 0 dec 15 13:44 file_redirect.txt
-rw-rr 1 user user 121 dec 9 17:17 README.org
bash: line 2: paco: command not found

List files

Use ls in the directory you want to explore

ls

List with properties using options -l and -la

ls -l
ls -la

List using wildcards

List all files ending in ".csv"

ls *.csv

List all files containing the characters "moda" within name, e.g., "acomoda", "comoda.txt"…

ls *moda*

Remove "x"

rm x

Copy a file using "cp source destination"

cp /home/text.csv  /home/myuser/text.csv

Copy multiple files, directories or disk using "rsync" (source, destination). The command accepts arguments:

  • "-r" recursive
  • "-v" verbose
  • "-a" archive (keeps info about files)
rsync -rav /home/user/Documents /run/media/user/disk/backup/

rsync can be also used with selective copyng based on file type

rsync /home/user/Desktop/*.jpg /home/user/Desktop/backupdata/

Create directory

mkdir new_dir

Remove (unlink) a directory

Some arguments:

  • -r: recursively unlink
  • -v: verbose
  • -f: force
rm -r new_dir

Remove a file

rm file.txt

Space used by a directory

du -hs /usr

Display directory

pwd

Change directory you are working from terminal.

Go to the home of the user

cd

Go one level up in the directory tree

cd ..

Go to "Documents" directory

cd /home/myuser/Documents

Use rmlint to search for duplicated or empty files

Install

sudo pacman -S rmlint

Run in the directory you want to check for duplicated or empty files

rmlint -g

This will create two files:

  • rmlint.sh
  • rmlint.json

The shell script can be used to delete duplicated files

OPTIONS:

  • h Show this message.
  • d Do not ask before running.
  • x Keep rmlint.sh; do not autodelete it.
  • p Recheck that files are still identical before removing duplicates.
  • r Allow deduplication of files on read-only btrfs snapshots. (requires sudo)
  • n Do not perform any modifications, just print what would be done. (implies -d and -x)
  • c Clean up empty directories while deleting duplicates.
  • q Do not show progress.
  • k Keep the timestamp of directories when removing duplicates.
  • i Ask before deleting each file
chmod +x rmlint.sh
bash -xcp rmlint.sh

Convert pdf to text or html using poppler

Use poppler and redirect the text to a org file. pdftotext converts a pdf to "txt" if no other format is specified

pdftotext foo.pdf foo
pacman -S poppler
pdftotext foo.pdf ->> foo.org # first option
pdftotext foo.pdf foo.org # second option

Convert pdf to html

pfdftohtml foo.pdf foo.html

Convert files using pandoc

Use pandoc with "-s" flag to produce a standalone document and "-o" to redirect output to a file.

In the example a file "foo" is converted from odt to org

pandoc -s -o foo.org foo.odt

Convert files to pdf using libreoffice

Convert odt file "tcl_online3.odt" to pdf

libreoffice --headless --convert-to pdf tcl_online3.odt

Using 'sed' to substitute text

"sed" is a stream editor for filtering and transforming text"…

This command in emacs editor

M-x woman [RET] sed

Visits the following file with info about sed

usr/share/man/man1/sed.1.gz

A brief example: I have a long comma separated text file with strings and need to include a line break after each comma (\n)

cat filetest
'string1', 'string2', 'string3'

Using sed and redirecting the output to "filetest1"

$ sed 's/\,/&\n/g' filetest > filetest1
'string1',
'string2',
'string3'

Send files to another machine with "croc"

sudo pacman -S croc

Then run:

croc send clown.txt

This will give a code

> Code is 34-04-paprika-sugar-micro
> On the other computer run
> croc 34-04-paprika-sugar-micro

More info about croc in Github repo

Move or rename

Use "mv source destination" command

mv  /home/myuser/text.txt /home/myuser/Documents/text.csv

Example: moving the ".config" files to ".config3", then moving ".config1" to ".config" to arrange configuration archives.

This creates a copy of each file in the same directory

pwd # check where are you now
# moving files
mv file1.txt file3.txt

Moving multiple files can be possible. Selecting all the files ending in ".mp3" within Downloads

mv ~/Downloads/*.mp3 ~/Music/

Moving multiple files included within a text file. Files are included in "filesmv2.txt" and are moved to "tmpfiles" directory. "t" argument stands for "target directory"

Each line in the "txt" file looks like this: '/home/user/file1.pdf' # original

$ cat filesmv2.txt | xargs mv -t ~/tmpfiles

Source: stackexchange

Moving multiple files using wildcards. This moves all files containing the sequence "nasa" in the middle of the name. '*' indicates that there are characters or numbers before and after the word "nasa"

mv *roco* -t ./direct

Flashing USB with "dd"

"dd" (convert and copy a file) is useful to copy information from a disk. It can be used to create bootable USB. An example with parabola:

sudo dd if=/home/user/Documents/parabola-2016.11.03-dual.iso of=/dev/sdb1

The ISO image is copied to "sdb1" (USB volume)

More files with examples of use of "dd" [../bash/dd_command.org][here]] and here

Display files

Show content of a file. Concatenates and writes file. Using "tac" reverses the result of "cat" command

cat file.txt

Using head, tail and less to show parts of files

Showing the first two entries

 head -n 2 /etc/hosts
127.0.0.1 localhost
127.0.1.1 myuser

Showing the last two entries

tail -n 2 /etc/hosts
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
less /etc/hosts
127.0.0.1 localhost
127.0.1.1 myuser
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

Backup a file

Using "cp"

cp bbdb{,.bak}
bbdb.bak

Backups with tar (tape archiver)

Back up of "home"

  • c = create file
  • v = verbose
  • f = write to a file/device
  • z = compress the file (gzip) "tar.bz"
  • j = compress the file (bzip2)
tar -czvf /tmp/home.tar.gz /home

Simple code to encrypt

Encrypt:

gpg -c X
gpg X

Use the code to remove the original file:

shred --remove X

Searching

Search for files

'find' can be used with multiple arguments such as:

  • -name: search for name
  • -iname: search for case-insensitive name
  • -type: type of file

    • f = file
    • d = directory

Search within all the directory and subdirectories by name

find ./ -name "gitea*"

./imagens/gitea-sm.png

Search for all the files ending in '.png'

find ./ -name "*.png"

./imagens/gitea-sm.png ./files/plot.png

Search for empty files in 'home'

find /home -type f -empty

'find' can also be used with grep to match patterns:

cd ~/Documentos/dat/intro_r/answers
find . | grep -E '.js|.png'
./plot.png
./vizjs.js
./Rplot.png
./bipartiteD3Script.js
./demo1.js

To find file with different name patters, 'find' can also be used as follows:

 find . -type f \( -name "*.org" -o -name "*.md" \)
./README.org
./bash_tutorial.org

Matching patterns

Print lines within files that match patterns

grep

Example: searching for all entries that have "root"

grep 'root' /etc/passwd
root:x:0:0::/root:/bin/bash

Additional arguments can be used with grep:

  • r: recursive search (within directories)
  • n: print line number
  • i: case-insensitive search
  • '*' Wildcards to search in all the directories

Search within files in the actual directory with wildcards

grep -rni IFELSE *
answers/repl_values.R:137: mutate(Status = ifelse(Status == "almost peak" &
answers/categ_colum.R:40:df$lead_likely <- ifelse(grepl("UNCOVERED CURB SERVICE", df$remarks), "non-lead", "unknown")
docs/vectorization.org:354:(counting number of repeated value), and ifelse (vectorized if…else

'grep' can be used also to search for files in directories as shown in the anterior example using grep with extended regular expressions ("-E") and 'find'

find . | grep -E '.js|.png'

In this example, 'find' will be passed to 'grep' and any pattern matching will be printed

Download files

This code download the file and the argument -O is to rename the file

wget https://filetodownload.org -O new_file

Devices

  • mount /what /where

    • what = device name
    • where = directory

      • /mnt = devices that mount occasionally
      • /media = devices that mount frequently
run/$USER/media/$LABEL

List process

Use ps, top or htop to list process:

  • ps reports a snapshot of the current process
ps aux | less
  • top display dynamic real-time view of linux process
top
  • htop displays an interactive process viewer
htop

To kill a process use:

kill [PID]

or

pkill [PID]

PID = process identificator

Evaluate time to load

In emacs:

time emacs --eval '(save-buffers-kill-terminal)'

Cool commands

cal # calendar
clear # clear output
uname # display system information (-r, -p, -a)
wc # wordcount (file name)
date # check the date