Sessió 3 curs programació linux
Sessió 3. Bash. 25/04/2008
===============
procés init -> és el procés pare a partir del qual neixen els processos fills el procés init s'inicia amb el sistema
Linux té 6 terminals: tty1 -> tty6
hi podem accedir mitjançant:
Ctrl+Alt+F1 -> anem a la terminal getty1
Alt+F7 per tornar a la termina gràfica
Quan ens loguem en un terminal com el tty1, ens apareix el bash com a interfície per defecte.
Escriptoris:
el Josep és partidari del
icewm -> ice window manager
és un escriptori lleuger i auster, i no té l'estètica del KDE o el GNOME és senzill i adaptable a les teves necessitars
gnome, kde, icewm i altres són clients per al servidor X es distingeix entre gestor de sessió (kde, gnome) i gestor de finestres (icewm, fvwm) el gestor de sessió sap passar informació entre
finestres: per ex, en el cas Windows, passar informació entre l'Excel i el Word.
xterm ens obre un terminal des del gestor de sessions o finestres, que simula el terminal hardware del 1969.
Ubuntu utilitza Gnome per defecte:
--Yo también prefiero Gnome, pero por razones personales, no técnicas. Tengo máquina de sobra para utilizar cualquiera de los dos, pero prefiero la sencillez y la funcionalidad del Gnome antes que el estilo recargado y cuasi-barroco de KDE. Pero como he dicho alguna vez, la preferencia Gnome-KDE obedece más a criterios personales que a otra cosa. No son mejores ni peores, son diferentes, y es el usuario quién decide cuál prefiere.--
$cat fitxer -> visualitza fitxers de text en pantalla $cat fitxer1 fitxer2 -> concatena fitxers en el canal estàndar de sortida
cat Concatena fitxers al canal de sortida (Visualitza fitxers text en pantalla).
Exemple: $ cat fitxer1 fitxer2
fitxer3
cp Còpia un fitxer(s) a un altre fitxer
Exemple: $ cp fitxer1 fitxer4 mv Mou un fitxer(s) cap a un altre fitxer (Canvi nom fitxer, directori, etc)
Exemple: $ mv fitxer1 fitxer5 rm Esborra fitxer(s)
Exemple: $ rm -f fitxer5 (-f, force)
Exemple: $ rm -i fitxer5 -> -i, estàs segur que vols esborrar? interactive
Ex: rs -Rf * -> se'ns esborra tot el disc
el canal de sortida pot ser la pantalla o un altre dispositiu, com ara la impressora per exemple, puc enviar un fitxer wav directament a la placa de so:
cat elvispresley.wav > /dev/dsp
envio el fitxer al canal de sortida que especifico, i sona la música
chmod Canvia proteccions fitxer(s)
Exemple: $ chmod a-w fitxer4
Exemple: $ chmod g-r fitxer4
Exemple: $ chmod u-r fitxer4
Exemple: $ chmod 777 fitxer4
chown Canvia propietari fitxer(s)
Exemple: $ chown lluis fitxer4
chgr p Canvia grup propietari de fitxer(s)
Exemple: $ chgr p alumnes fitxer4
umask Estableix proteccions per defecte
Exemple: $ umask 022
cmp Compara dos fitxers
Exemple: $ cmp fitxer1 fitxer2 diff Compara dos fitxers
Exemple: $ diff fitxer4 fitxer2
Exemple: $ diff -r dir1 dir2
find Cerca de fitxers que responen a un criteri
Exemple: $ find . -name "*.dat -print od Exposa contingut fitxer en octal o hexadecimal en stdout
Exemple: $ od -c fitxer2
cd /proc -> els fitxers que són números, són els processos que estan funcionant en el SO això no vol dir que hi hagi un directori que es digui /proc. No. És el Kernel. Estem dialogant amb el kernel cat /proc/cpuinfo -> el resultat que obtenim és una resposta del kernel
--
Comandes i albarans:
http://platea.pntic.mec.es/~jlopez5/cv3.html
http://platea.pntic.mec.es/~jlopez5/cv4.html
--
ls Visualitza els fitxers existents dun o més directoris
Exemple: $ ls
Exemple: $ ls -la
pwd Visualitza els directori de treball per defecte
Exemple: $ pwd
mkdir Crea un directori
Exemple: $ mkdir dir1
rmdir Esborra un directori
Exemple: $ rmdir dir1
Operacions sobre processos:
ps Status de processos
kill Para bruscament un proces
nice Executa comanda amb baixa prioritat
<ctrl-z> Suspén lexecució de la comanda actual
bg Continua execució comanda suspesa en el background.
fg Torna a activar comanda suspesa.
sleep Suspèn lexecució durant n segons.
at Encua una comanda per ser executada a par tir dun
temps especificat. Examina la cua de treballs pendents Esborra de la cua un treball.
nohup Executa una comanda inmune a qualsevol senyal
que intenti aturarla. Si hom sur t de la sessió, la comanda seguirà executant-se batch. Executa una comanda quan la càrrega del sistema ho permeti. El canal de sor tida standard serà el correu electronic Ampersand wikipedia (put ?)
Exemple
$ emacs -> podem treballar amb emcas, però no podem treballar amb la consola perquè està ocupada $ emacs & -> podem treballar amb emacs i amb la consola en background
$ emacs -> no podem treballar amb la consola.
Aleshores:
$ ctrl-z -> treballem amb la consola i no podem treballar amb el emacs $bg (background) -> ja podem treballar amb el emacs
Bash
només hi ha un tipus de variables: cadena de caràcters. No cal declarar les variables
Ex:
VAR=V1
VAR=V1 V2 -> dóna error
VAR="V1 V2" -> no dóna error
echo -> repeteix en el cana estàndar de sortida echo hola amb echo puc mirar el contingut de les variables echo $VAR el bash, abans de invocar echo, ha substituït $VAR pel seu valor. Per tant, echo el que veu és "V1 V2"
echo * -> visualitzem els fitxers del directori, perquè * és un meta-caràcter echo "*"
VAR=$VAR+1 -> compte! sense espais. Les variables són cadenes de caràcters i el que obtenim és "V1 V2+1"
la suma la puc fer per ex:
VAR=$(($VAR+1)) (vàlid si VAR conté un número)
echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games
la separació de directoris és amb ':'
PATH=$PATH":." -> afegim al PATH el ., que és el directori de treball
la primera paraula en la línia de comandes ha de ser un executable una alternativa a modificar la variable PATH per execurar la comanda aaa és ./aaa (li estem indicant la ruta del directori de treball)
escrivim en el fitxer exemple1, li donem permisos d'escriptura, i l'executem #!/bin/bash for pep ; do echo $pep ; done
quin valor té la variable pep? doncs la mateixa línia
$ chmod +x exemple1
$ ./exemple1 hola que tal
$ ./exemple1 *
-> hem fet el primer guió, que és un fitxer executable
que conté comandes de bash o d'un altre llenguatge interpretat.
És un text executable gràcies a un conveni:
- !/bin/bash
- és un comentari en la primera línia, i en aquest cas en diu que les comandes que conté són bash. /bin/bash és l'executable que interpretarà el text. El mateix faríem per perl o per python.
Si no, hauríem de fer #bash exemple1, que també és factible.
Originalment, el for el que fa és prendre valors d'una llista (per defecte, de la línia de comandes)
for pep in "això sembla que funciona, oi?"; do echo $pep ; done for pep in això sembla que funciona, oi?; do echo $pep ; done -> ho agafa paraula per paraula
paraules="això sembla que funciona, oi?"
for pep in $paraules; do echo $pep ; done
$ for ((i=1; $i<=5 ; i++)); do echo $i; done -> és el for del C, que és un 'mentres' camuflat
$ if gcc -o prova.c ; then ./prova; else echo "programa incorrecte"; fi només s'executa prova si és el muntatge ha estat correcte
per comptar números amb el while:
i=1; while [ $i -le 5 ]; do echo $i; i=$(($i+1)); done [] és una comanda, i $i -le 5 són els arguments de la comanda [] és el sinònim de test, que retorna cert o fals depenent dels arguments man test while llista;...
[$i -le 5 ] simula la llista
INTEGER1 -le INTEGER2
INTEGER1 is less than or equal to
INTEGER2
$ function quants () {
> i=1; for a in $*; do i=$(($i+1)); done echo la funció $0 ha detectat
>$i arguments }
$ quants avui farem 4
Es pot reemplaçar la comanda per la sortida de la comanda. Substituir el nom de la comanda per la seva sortida bash permet dues formes de fer-ho:
$(comanda)
` comanda`
si la variable i conté 4:
echo $(($i+1)) -> dóna 5
echo $($i+1) -> dóna error
aquesta és la grandesa del UNIX (i la dificultat)
Còpia de seguretat desatesa del contingut del portàtil (el fitxer sencer està més avall)
hi ha unes eines molt bona per fer backups (paquets de
Debian): rdiff-backup (utilitza el protocol rsync), i dirvish
linux/crondaily/backup
- m h dom mon dow command -> minut, hora, dia del mes, mes, dia de la setmana, comanda a executar
5 0 * * * run-parts ${HOME}/linux/cron.daily -> cada dia, a les 00:05, executo run-parts amb l'argument...
/etc/init.d -> hi ha els guions d'inicialització (que poden activar dimonis). Per exemple, guions per iniciar el X11, la xarxa,...
tot el que trobi en el directori cron.daily intentarà executar-ho
date +%Y%m%d -> date i un argument per indicar com s'escriu date
rsh -> remote shell
tar -zcf -> comprimir, crear, fitxer . Fem un tar remot, em posa el tar a un recurs de la xarxa el protocol que utilitza el tar depèn de variables de entorn
necessito saber quants backups hi ha:
quants=$(rsh $nomhost -l$usuari ls -t
$dirBackup/"cursice*.tgz"| wc -l )
-t -> faig un ls temporal (no alfabètic) dels *.tgz la sortida de ls l'envio a un pipe, amb un filtre que és un comptador de línies (wc -l) vull eliminar còpies antigues, de manera que en quedin 3.
tail -> agafo la cua del llistat. Recullo els últims $num \rm -> no facis cap cas del alias. Vull que executi rm directament
==== FITXER CRONTAB ========================
export MAILTO="cursice"
usuari=cursice
home=/home/cursice
nomhost=festuc
dirBackup=elsMeusBackups
aGuardar=/home/cursice/
arxiuBackup=$dirBackup/cursice$(date +%Y%m%d).tgz
guarda=3
rsh -l$usuari $nomhost ls ">" $ArxiuBackup tar -zcf $usuari@$nomhost:$backupfile $aGuardar echo Backup $arxiuBackup finalitzat quants=$(rsh $nomhost -l$usuari ls -t $dirBackup/"cursice*.tgz"| wc -l )
num=$(($quants-$guarda))
echo $quants $num
if [ $num -gt 0 ] then l=$(rsh $nomhost -l$usuari ls -t $dirBackup/"cursice*.tgz" | tail -n $num ); echo esborrant $l ; rsh $nomhost -l$usuari "\rm" -f $l fi