”egrep” och ”fgrep” kommer att försvinna

Från version 3.8 kommer ”grep” att ge varningar när man använder ”egrep” och ”fgrep”. Dessa kommandon kommer att försvinna med tiden. De är en kvarleva från tider när utrymme var ont om.

Istället för ”egrep” och ”fgrep” ska man använda ”-E” och ”-F” respektive.

”-F” används för att söka med en fix sträng. Tex grep -F "/mnt" /etc/fstab.

”-E” används för utökad reguljära uttryck. Vissa tecken får en speciell mening, som tex ’?’, ’+’, ’{’, ’}’ och behöver inte ledas med ’\’ för att få dess speciella mening. Läs mer på länkar nedan.

https://www.gnu.org/software/sed/manual/html_node/BRE-vs-ERE.html

https://www.gnu.org/software/grep/manual/html_node/Basic-vs-Extended.html

Starta ett program med fördröjning – KUbuntu 14.10

Jag stötte idag på ett problem där jag behövde starta ett program efter några sekunder, och letade på nätet efter hur man kan göra och självklart hittar man lösningen. Denna gång utan allt för mycket svårigheter. I det här fallet skulle jag starta en ljudspår efter 10 sekunder.

Eftersom jag inte tror att det finns en lösning i grafiskt läge, utan jag behöver en lösning i terminal, så visade det sig att problemet bestod av två delar. Exemplet nedan visar hur jag använder upplägget. Fungerar även utan parentes, vet inte vad dessa gör.

(echo "sleep"; sleep 10 ; echo "playing") | play sound.mp3

Del ett – program att spela ljudfiler

Del ett var att hitta ett program som kunde spela upp en ljudfil, det blev programmet ”play” som finns i paketet ”sox”. Dessutom visade det sig att jag behövde lägga till stöd för mp3.

sudo apt-get install sox libsox-fmt-all

Jag hade säkert inte behövt installera libsox-fmt-all, när det i det här fallet bara var mp3-stödet som behövdes.

Del två – skapa fördröjning

Del två var att skapa en fördröjning innan play skulle köras igång. Ett enkelt sätt var att använda kommandot ”sleep”. För 10 sekunders fördröjning skriver visas i exemplet nedan.

sleep 10

Nu trodde jag att det var att bara pipe:a (|) ihop dessa två lösningar, men se det gick inte. Play körde igång direkt utan fördröjning. Så jag var tvungen att hitta ytterligare en lösning på ett problem. Det visar sig att man måste klä ”sleep” med någon typ av output. Och svaret ser ni i början där jag lagt till detta. Den första ”echo” kommer att skrivas ut, men verkar inte behövas egentligen för att få ”sleep” att fungera som tänkt. Den andra ”echo” skrivs inte ut vad jag kunnat se. Verkar vara så att den andra ”echo” skickas som input till programmet efter pipe-tecknet.

Om du inte läste rubriken så kör jag KUbuntu 14.10 när detta skrivs.

Länkar

Första två länkarna har med uppgiften att göra, övriga tre länkar har med pipe att göra.

http://linux.die.net/man/1/play
http://stackoverflow.com/questions/15491222/bash-timed-piping

http://man7.org/linux/man-pages/man2/pipe.2.htmlhttp://www.linfo.org/pipes.html
http://stackoverflow.com/questions/1072125/how-does-piping-work-in-linux

Loggning från ett bash-script

Jag kom att tänka på att loggning till syslog skulle vara bra när man skriver egna script, så jag har lagt till stöd för detta i mitt script för att göra backup. Jag kommer inte här att visa den delen av scriptet, utan jag visar hur man gör med loggningen.

Detta körs på Ubuntu, men borde fungera även på andra distar.

Jag har använt programmet ”logger” som installeras med paketet ”bsdutils”.

sudo apt-get install bsdutils

Skriver du i bash

~$ logger Test

så kommer det att visas i /var/log/syslog som

<date-and-time>  <computer-name> <user>: Test

Kan man då visa variabler i den text som logger skickar till syslog? Ja-visst kan man det.

#!/bin/sh
VAR1="BLABLA"
logger "Test of variable: VAR1 = $VAR1"

Detta lilla script kommer då att se ut något som följer i syslog

<date-and-time>  <computer-name> <user>: Test of variable: VAR1 = BLABLA

Självklart ska man inte skriva ”~$” för det är prompten i bash som ibland ser ut så.

Versioner

~$ logger --version
logger from util-linux 2.20.1

~$ bash --version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)

Länkar

  1. Sökning med orden ”logging to syslog linux from bash”
  2. http://www.cyberciti.biz/tips/howto-linux-unix-write-to-syslog.html

 

Beräkna hur lång tid ett bash-script tar

Jag har länge tänkt att jag ska fixa en tid-tagning för några av mina bash-script, men det har aldrig blivit av, förrän nu.

Jag har egentligen inte gjort så mycket själv, annat än att Googla efter rätt information. Jag sökte med ”bash calculate time difference” och då hittade jag följande länk.

# sTime - indicates start of execution
# eTime - indicates end of execution
# dTime - indicates difference between sTime and eTime
# at the end of the script I calculate time for execution

sTime=$(date +"%s")
# här ligger det skript jag har som jag vill beräkna tiden den tar på sig
eTime=$(date +"%s")
dTime=$(($eTime-$sTime))
echo ""
echo ""
echo "##########################"
echo "Time: $(($dTime / 3600 )) hours $((($dTime % 3600) / 60)) minutes $(($dTime % 60)) seconds"
echo "##########################"
echo ""

Något jag upptäckte var att det är kritiskt med blanktecken och parenteser på olika platser. Tex sTime=$(date +"%s") behöver ett mellanslag mellan date och +. Jag skrev första gången ihop dessa och då fungerade det inte. Jag tyckte först inte att det behövdes dubbla parenteser runt beräkning av dTime, men se det fick jag också ångra.

Du kan så klart använda andra namn på variablerna och annan text. Och ja, jag försöker så gott det går att använda engelska när jag skriver kommentarer i min kod. Det går inte att komma från att svenska är ett udda språk för oss som är utvecklare. Då 99% av all hjälp som finns att få på nätet skrivs på engelska så är det bara naturligt att fortsätta på den vägen.