wtorek, 27 lipca 2010

Bash-Shell część 1


Pokaż komentarze


Szukałem dziś prostej możliwości zmiany nazw plików z dużych liter na małe i odwrotnie. Zastanawiałem się nad tym jaki mądry program mi to zrobi. Nagle mnie olśniło - bash!!
Większość z nas widząc konsole terminala z migającym kursorem chce jak najszybciej uciec z radością witając okienkowy system, gdzie porusza się dość swobodnie z użyciem myszki. Powstaje zatem pytanie: czy  warto w erze graficznych nakładek na wszystko, zapominać o podstawie, o tym skąd to się wszystko wzięło? Myślę, że nie bo w konsoli tkwi MOC i nie mam tu na myśli tylko konsolowego odtwarzacza muzyki :)



Co to jest BASH?
BASH to skrót od: Bourne Again SHell. Stworzony został przez Briana Foxa i Cheta Rameya. Jest zgodnym z sh interpreterem poleceń, łączący w sobie zalety shella Korna (ksh) i C-shella (csh).
BASH to najbardziej popularna powłoka używana na systemach unixowych, jest też skryptowym językiem programowania, umozliwiającym efektywne zarządzanie systemem. Taką mniej więcej definicję można podać za: wiki

Biorąc pod uwagę, że w powyższej definicji pojawiło się hasło skrypt zastanówmy się:

Co to jest skrypt?

Skrypt jest to tekstowy plik wykonywalny, zawierający polecenia systemowe oraz polecenia sterujące jego wykonaniem (instrukcje, pętle itp.). Wykonywany jest tylko i wyłącznie przez interpreter:  /bin/bash, który tłumaczy polecenia zawarte w skrypcie na język zrozumiały dla procesora.

I na mocy tego ostatniego chciałbym się skupić w mam nadzieję cyklu, który uda mi się w miarę wolnego czasu uskutecznić :)

Dlaczego warto pisać skrypty?

Chyba najprostszą odpowiedzią jest: z lenistwa :) 
Odpowiedź ta jest trochę paradoksalna. Jak to robić coś z lenistwa? A no tak to :D

Załóżmy, że często wykonujemy jakieś operacje. Ja np. lubię aktualizować system z poziomu konsoli. W tym celu wykonuję grupę poleceń:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get autoremove
sudo apt-get autoclean
Sprowadziłem sobie tą grupę poleceń do jednej "komendy": update. I to jest to moje lenistwo, o którym mówiłem wyżej.

Czas chyba po tym dość długim wstępie rozwiązać problem, od którego się to wszystko zaczęło: Zmiana nazw plików z dużych liter na małe (lub odwrotnie) w danym katalogu. W moim przypadku było to potrzebne przy wklejaniu zdjęć na serwer znajomych. Miałem stworzone skrypty, które odczytywały *.jpg i je wyświetlały, a mój Canon z uporem maniaka dawał mi pliki *.JPG. Czas więc na szybkie zmiany nazw tak aby nie robić tego ręcznie z każdym plikiem.


Docelowo chciałem abym mógł wywoływać skrypty zgodnie z powyższym screenem i teraz pokażę jak to zrobić.

1. Stworzymy plik skryptu o wybranej przez nas nazwie. Ścieżka, którą wpiszemy jest związana z miejscem, w którym nautilus przechowuje swoje skrypty tak, aby umożliwić wywoływanie go prawym klawiszem zgodnie z powyższymi założeniami.
gedit ~/.gnome2/nautilus-scripts/duże\ na\ małe
w powyższym zapisie użyliśmy w nazwie tworzonego pliku: "duże na małe" znaki "\" zastępujące spacje. Jeżeli je pominiemy gedit utworzy nam 3 pliki: duże, na, małe.

Do otwartego pliku wklejamy następującą zawartość:
!#/bin/bash
export IFS="
"
for file in *; do mv ${file} `echo ${file} | tr "A-Z" "a-z"`; done
Po zapisaniu nadajemy plikowy prawa do wykonania:
chmod +x ~/.gnome2/nautilus-scripts/duże\ na\ małe
i już działa :D

Stworzenie skryptu zamieniającego litery małe na duże będzie analogiczne:
gedit ~/.gnome2/nautilus-scripts/małe\ na\ duże
Do pliku wklejamy następującą zawartość:
!#/bin/bash
export IFS="
"
for file in *; do mv ${file} `echo ${file} | tr "a-z" "A-Z"`; done
Po zapisaniu nadajemy plikowy prawa do wykonania:

chmod +x ~/.gnome2/nautilus-scripts/małe\ na\ duże


Etykiety

/etc/network/interface 12.04 precise pangolin 2clickupdate 2clickupdatecore accounts adesk admin adobe air ailurus akonadi aktualizacja ubuntu alias allegro alpha3 alsamixer ankieta apache apparmor apt-fast apt-get aptitude arandr arista ascii audio avast axel backup badblock baner bash bashrc beta bg bing bleachbit blip blkid blog blokada ikon bluetooth błąd bootchart brasero bug c_rehash cache caps_lock cardapio cat cd-rw centrum-oprogramowania certutil certyfikat chattr checkinstall chmod chown chrome chromium ciekawostki clipboard cmd compizconfig-settings-manager conky conky_netbit cookies cp cpuburn crebs cryptkeeper ctrl+alt+backspace cups cups-pdf curl czas pracy na baterii czcionka dansguardian dash dbupdate dconf-editor dconf-tools dd deb debian denyhosts depicus dev devilspie dhc dhcp dhcp3-server digikam diskdump disown dist-upgrade distro timeline dkclient dlna dns dns-320 do-release-upgrade docky dpkg dropbox dtrx dvd-rw dyski dźwięk echo eclip-x eizo ekg2 elementary else emense empathy enca error eth0 eth1 eth2 eth3 ethtool ext4 ext73 Faenza Faience fdisk fg figlet file-browser firefox firmware flash foff fog project foldery font foto free -m freetuxtv fstab ftp gadu-gadu gconf gconf-cleaner gdebi gdiskdump gdm gg git giver gksu glippy gmail-notifer gnac gnash gnome gnome-disk-utility gnome-do gnome-shell gnome-tweak-tool gnomebaker google gparted gpedit.msc gpg gra grafika grep grsync grub grub2 gui gurlchecker gwibber hardstatus hasła hdd hold homerun hostname hosts hotmail hp2100 htop http https humor i-nex iconv ideal.pl if ifconfig ikony indicator applet indicator-multiload instalacja intel ip iperf ipla iptraf iso jabber jail java jNetMap jobs k3b kadu katalog kde keiryng kernel kernel instalator kernel terminator kernel wywalator keylock kill killall klonowanie klucze kodeki kodowanie kontrola rodzicielska konwersja kubuntu kupfer kvm lamp launchpad libpeerconnection.log librecad libreoffice libssh lightdm lighttpd linux livecd load log lsb_release lsb-core lucid macosx make make install maverick meerkat mc medibuntu menu microsoft minidlna mint minus mkfs mkfs.ext3 moc monospace moonlight mount mount-error-cannot-allocate-memory multi-flex multiboot multicd multimedia muzyka mysql namebench nanny nano napisy nas natty nautilus nautilus-gksu nautilus-open-terminal ncdu netactivity news nmap notify-osd nvlc o2 oneiric ocelot opendns openoffice openssh-client openssl outlook owncloud pac pacmanaer paczka paczki panel partial partycje passwd pastie pdf phatch photivo photofilmstrip php phpmyadmin phpsysinfo pidgin pidof ping pisak pkill plank plasma pliki plugin płatne programy pogoda pojemność baterii polecenia polityka prywatności poweroff ppa ppa-purge ppasearch procesor przedlądarka pulpit pulseaudio pxe pxe server python qnap quantal radio ram raw rawtherapee rc.local rdesktop rdp rdpv5 recovery redshift regedit.exe remastersys remove-apt-repository renamer repozytorium rescueboot resize grip rfkill rhythmbox rj45 rkhunter rm root rootkit rtorrent saidar samba sbackup scp screen screenrc sdb seagate sed sentymentalnie server serwer sftp share shell shellinabox shotwell shutdown shutter sieć silicon silicon empire silverlight SimpleHTTPServer skróty klawiszowe skrypt skydrive smestorage sparkleshare specto splash sprzęt squid srt ssd ssh ssh-copy-id ssh-keygen ssl stacja graficzna stały ip styl su subtitleeditor sudo swap swat sycany synaptic sync synchronizacja synchrorep synology sysv-rc-conf szybkość sieci tablet tabulator tahoma tak tapety tar.bz2 tar.gz tasksel tekst telefon telepathy-oxygen telepathy-sunshine telnet temat terminal terminal server client test testdrive tetris tftpd tgz theme thunderbird tinyproxy tło top torrent traceroute transmission transmission-daemon trashindicator treminal trick truecrypt trusty tryb awaryjny ttf tune2fs TV ubuntu ubuntu.kubuntu.terminal udev-notify UID umount unity update update-ca-certificates update-grub upgrade upnpc usb user ushare uuid vbox vboxmanage veromix viewnior virtualbox visudo vlc vncviewer vsftpd w wacom wake on lan webmin wget who whowatch wifi windows windows 8 windows server 2012 windows7 wine wirtualizacja wlan wodim wol wp7 wskaźnik baterii www wygląd x2go x2goclient xbmc xclip XDG_DIR xkill xorg xorg-serwer xorg.conf xterm yes yetris youtube youtube-dl zenity zip zrzut ekranu