diff --git a/README.md b/README.md deleted file mode 100644 index 7ee6e8b..0000000 --- a/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# bash-tutorial - -Tutorial with some basic use of bash \ No newline at end of file diff --git a/README.org b/README.org new file mode 100644 index 0000000..b76575f --- /dev/null +++ b/README.org @@ -0,0 +1,5 @@ +* Bash tutorial + + Tutorial with some basic commands, tips and options to use bash + + * [[./bash_tutorial.org][Tutorial]] diff --git a/bash_tutorial.org b/bash_tutorial.org new file mode 100644 index 0000000..7db83bf --- /dev/null +++ b/bash_tutorial.org @@ -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]]