Adding first document

This commit is contained in:
Jose 2021-12-09 17:18:43 -03:00
parent 1e2d77dcab
commit 2f368fdac8
3 changed files with 621 additions and 3 deletions

View File

@ -1,3 +0,0 @@
# bash-tutorial
Tutorial with some basic use of bash

5
README.org Normal file
View File

@ -0,0 +1,5 @@
* Bash tutorial
Tutorial with some basic commands, tips and options to use bash
* [[./bash_tutorial.org][Tutorial]]

616
bash_tutorial.org Normal file
View File

@ -0,0 +1,616 @@
#+TITLE: bash commands
#+DATE: 2021-08-30
#+STARTUP: indent
#+OPTIONS: num:nil
* DONE work in bash tutorial
:LOGBOOK:
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
:END:
* 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
[[https://wiki.archlinux.org/title/Environment_variables]["Environment variables" in: Arch wiki]]
To add a directory to the PATH for local usage, put
the following in "~/.bash_profile":
#+begin_example bash
export PATH="${PATH}:/home/my_user/bin"
#+end_example
This will add the directory at the end of $PATH. To update the variable, re-login or source the file:
#+begin_example bash
source ~/.bash_profile
#+end_example
Then check directories in "$PATH"
#+begin_example bash
echo $PATH
#+end_example
* Adding a new user
Check users that are logged
#+begin_src bash
users
#+end_src
#+RESULTS:
: myuser
New user called "test"
#+begin_example bash
sudo useradd -p -m test
#+end_example
The configuration file "useradd" sets options for this command:
#+begin_src bash
sudo less /etc/default/useradd
#+end_src
#+RESULTS:
| # 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:
#+begin_src bash
head -4 /etc/passwd
#+end_src
#+RESULTS:
| root:x:0:0::/root:/bin/bash |
| bin:x:1:1::/:/sbin/nologin |
| daemon:x:2:2::/:/sbin/nologin |
| mail:x:8: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
#+begin_src bash
lshw | head -4
#+end_src
#+RESULTS:
| 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
#+begin_example bash
mpv https://live0.emacsconf.org/main.webm
#+end_example
** Run a bash script
*** Write script
After writing, save the file with '.sh' extension. This script will
echo the words within quotes
#+begin_src bash
#!/bin/bash
echo "Hellow hu-hu"
#+end_src
#+RESULTS:
: Hellow hu-hu
*** Option a: make it executable
Use the command "chmod" to change permissions for the file
#+begin_example bash
chmod +x script.sh
#+end_example
Then, execute
#+begin_example bash
./script.sh
#+end_example
*** Option b: run from terminal
#+begin_example bash
bash script.sh
#+end_example
Or
#+begin_example bash
sh script.sh
#+end_example
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
* Manuals
Use the command ~man~ or ~info~ followed by the name of the function or program
#+begin_src bash
man
#+end_src
#+RESULTS:
| What manual page do you want? |
| For example, try 'man man'. |
: man man
: man hier
Showing only the first four lines
#+begin_src bash
info | head -4
#+end_src
#+RESULTS:
| 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: | | | | | | | |
: info bash
* 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
"|" pipe lets the input to be passed 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
** 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
Removes directory
: rm -r new_dir
Removes 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
#+RESULTS:
|'string1',|'string2', |'string3'|
Using ~sed~ and redirecting the output to "filetest1"
: $ sed 's/\,/&\n/g' filetest > filetest1
#+RESULTS:
| '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 [[https://github.com/schollz/croc][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: [[https://unix.stackexchange.com/questions/115734/move-file-by-list-in-file-with-leading-whitespace][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 [[~/Documentos/GNU/bash/dd_command_wiki.org][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
#+begin_src bash
head -n 2 /etc/hosts
#+end_src
#+RESULTS:
| 127.0.0.1 | localhost |
| 127.0.1.1 | myuser |
Showing the last two entries
#+begin_src bash
tail -n 2 /etc/hosts
#+end_src
#+RESULTS:
| ff02::1 | ip6-allnodes |
| ff02::2 | ip6-allrouters |
#+begin_src bash
less /etc/hosts
#+end_src
#+RESULTS:
| 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
Print lines that match patterns
: grep
Example: searching for all entries that have "root"
#+begin_src bash
grep 'root' /etc/passwd
#+end_src
#+RESULTS:
: root:x:0:0::/root:/bin/bash
** Download files
This code download the file and the argument ~-O~ is to rename the file
#+begin_example
wget https://filetodownload.org -O new_file
#+end_example
* 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
* References:
* [[https://wiki-dev.bash-hackers.org/][The bash hackers wiki]]
* [[https://link.springer.com/content/pdf/bfm%3A978-1-4302-6829-1%2F1.pdf?error=cookies_not_supported&code=2e41714e-ca8f-4796-a077-3243c836ec90][Beginning the linux command line]]
* [[https://pandoc.org/][Pandoc manual]]
* [[https://stackoverflow.com/][stackoverflow]]