FOK!forum / Digital Corner / you@shellscripts$ enter() { echo "Shell scripting ftw!, deel 1
slacker_nlmaandag 14 januari 2008 @ 11:22
Welkom in het centrale shell scripting topic.

Als je vragen hebt over shell scripting, dan zit je hier goed. Hier zitten idioten die verstand denken te hebben van shell scripting en je helpen om leuke nifty scriptjes te maken in de unix shell.

Mocht je een probleem hebben met je code, post deze dan even. We kunnen anders niet zien wat je precies aan het doen bent.

Nieuw met shell scripting?
Voor mensen die nieuw zijn in shell scripting, die raad ik aan om de introductie te lezen en de bash tutorial eens door te lezen. Als je wilt beginnen maakt het eigenlijk niet uit welke shell je wilt gebruiken, bash, zsh, ksh, csh, etc, etc, ze doen allemaal hetzelfde namelijk, je interface op de commandline zijn. Als je begint is het handig om bash te leren, aangezien het zeer goede documentatie heeft. Maar de andere shells worden ook actief gebruikt. In het kort, pick any, en maak daarna de eventuele overstap naar een andere shell (altijd leuk om een andere shell te leren ).

* Shell HOWTO in het Nederlands
* Een intro in shell scripting (bash)

Het portable maken van scripts
Als je een script portable maakt moet je rekening houden dat je niet altijd overal de GNU versies van verschillende applicaties hebt, dat betekend dus dat je bijvoorbeeld `sed -i' niet kan uitvoeren, en dus een andere manier hiervoor moet vinden.
Ook kan het inhouden dat je code onder andere shell talen komt te draaien. Houd hier rekening mee in je code. Op Solaris bijvoorbeeld kan je in een script die /bin/sh aanroept geen bash specifieke functies aanroepen, of syntax gebruiken. Solaris gebruikt in tegenstelling tot Linux de echte born shell. Over Solaris gesproken (en andere distro's), implementaties van sommige functies heten anders (truss en strace, tcpdump en snoop bijvoorbeeld) of hebben een andere parameters. Maar voor vragen daarover kan je in [Linux/Unix] [/Gurus/helpen/newbies]$ ./deel zoveel topic terecht (de link wijst overigens naar de wiki, daar staat namelijk de correcte URL naar het laatste topic).

Welke shell gebruik ik nou?

Welke shell je gebruikt staat in het /etc/passwd bestand. Er is een omgevings variabele SHELL die aangeeft welke shell in het wachtwoordbestand staat. Om deze variabele op te vragen moet je hetvolgende doen.

1
2
3
4
5
echo $SHELL
# Of
env | grep SHELL
# en ter overbodigheid
grep username /etc/passwd | awk -F\/ '{print $NF}'


Dit is echter geen garantie dat je ook daadwerkelijk de shell draait waar je op dat moment mee werkt. Kijk maar:

1
2
3
4
#zsh is mijn standaard shell
$ bash
$ echo $SHELL
/bin/zsh


Om er dan achter te komen welke shell je echt draait, kan je dit uitvoeren:
1echo `ps -p $$` 


Tips and tricks
Ergens verstopt (lees, op dit moment nog nergens te vinden) in wiki staat er een handige pagina met shell functies die jou kunnen helpen. Deze zijn afkomstig uit o.a. Het linux n00bs en guru's topic, of komen uit deze topicreeks.

Meer over de shell(s)
* GNU bash
* Zeer uitgebreide bash tutorial, ook handig als referentiemateriaal
* Bash reference manual
* Bourne/Korn Shell coding conventies (OpenSolaris)
* Zsh user guide
* Alleen maar shell scripting.. (forum)

Mocht je meer vragen hebben over shell scripting, op eu.freenode.org heb je verschillende kanalen, waaronder #bash. #zsh en andere #shells zullen ook wel bestaan.

Deze OP en instructies voor nieuw topic: http://wiki.fok.nl/index.php/OP/DIG/centraal/bash
Mocht je een link vinden die zeker in de OP hoort, twijfel niet en zet hem erbij!

Big fucking warning
Ga nooit "leuk" zijn en mensen vertellen dat ze rm -rf /, moeten uitvoeren, dit wordt ZWAAR bestraft door de mods @hier en terecht. Voor de mensen die niet precies weten wat dit doet: rm -rf is een recursive, geforcede delete (rm == remove) actie op de root van je systeem. Mocht je als root zijn ingelogd dan verwijder je alle bestanden van je systeem en zal je snel merken dat je PC niet meer boot en je al je data kwijt bent. Mocht je een gewone user zijn en dit uitvoeren, dan heb je grote kans dat je homedir pleitte is, en andere bestanden buiten je $HOME, waar jij de eigenaar voor bent en/of group schrijfrechten voor hebt. Voer dit daarom dan ook NOOIT uit (tenzij je pijn leuk vind of als je in een virtuele omgeving zit waar dataverlies niet uitmaakt). Als we een post vinden waarin we dit zien, kijk er dan niet raar vanop dat je niet meer kan posten in DIG, of op heel Fok for that matter. U bent gewaarschuwd!

[ Bericht 8% gewijzigd door slacker_nl op 14-01-2008 18:04:05 ]
whoopsmaandag 14 januari 2008 @ 11:48
1
2
3
4
5
6
7
#!/bin/bash
CHARS=(t v p)
for C in ${CHARS[@]}
do
    echo -n $C
done
echo ''


Daniel1976maandag 14 januari 2008 @ 12:11
-edit-

[ Bericht 83% gewijzigd door Sander op 14-01-2008 12:52:19 ]
Daniel1976maandag 14 januari 2008 @ 12:12
--

[ Bericht 93% gewijzigd door Sander op 14-01-2008 16:06:55 ]
Sandermaandag 14 januari 2008 @ 12:14
Dat kan je je postrechten kosten Daniel. Zeg maar voor altijd.
whoopsmaandag 14 januari 2008 @ 12:51
quote:
Op maandag 14 januari 2008 12:11 schreef Daniel1976 het volgende:
apt-get install humor?
AlphaOmegamaandag 14 januari 2008 @ 12:53
quote:
Op maandag 14 januari 2008 12:14 schreef Slarioux het volgende:
Dat kan je je postrechten kosten Daniel. Zeg maar voor altijd.
Daarbij zijn dat commando's die zo ontzettend zielig zijn om te roepen in dit soort topics.

Interessant topic, deze reactie tevens als TVP.
slacker_nlmaandag 14 januari 2008 @ 12:54
quote:
Op maandag 14 januari 2008 12:14 schreef Slarioux het volgende:
Dat kan je je postrechten kosten Daniel. Zeg maar voor altijd.
nee, dit kost je postrechten:

DUS NIET UITVOEREN APEN!!

[ Bericht 1% gewijzigd door Sander op 14-01-2008 13:14:04 (niet doen) ]
WyriHaximusmaandag 14 januari 2008 @ 15:06
Zo ook maar ff een TVPtje maken .
slacker_nlmaandag 14 januari 2008 @ 15:46
quote:
Op maandag 14 januari 2008 12:54 schreef slacker_nl het volgende:
nee, dit kost je postrechten:
mietje slar
tony_clifton-woensdag 16 januari 2008 @ 13:52
quote:
Op maandag 14 januari 2008 11:48 schreef whoops het volgende:

[ code verwijderd ]

Wat doet 't ofzo? Ik ken niks van code dus zou wel graag weten wat 't is voor ik 't eens uitprobeer
whoopswoensdag 16 januari 2008 @ 13:57
quote:
Op woensdag 16 januari 2008 13:52 schreef tony_clifton- het volgende:

[..]

Wat doet 't ofzo? Ik ken niks van code dus zou wel graag weten wat 't is voor ik 't eens uitprobeer
Deze code print de letters TVP op je console.

Om dit de draaien moet je die code in een bestand opslaan (bijvoorbeeld filename.sh), dan met de terminal naar de directory waar het in staat en dan 'chmod +x filename.sh', en uitvoeren door ./filename.sh uit te voeren.
tony_clifton-woensdag 16 januari 2008 @ 14:17
Ah k
ingewikkeld!
slacker_nlwoensdag 16 januari 2008 @ 16:06
quote:
Op woensdag 16 januari 2008 13:57 schreef whoops het volgende:

[..]

Deze code print de letters TVP op je console. :)

Om dit de draaien moet je die code in een bestand opslaan (bijvoorbeeld filename.sh), dan met de terminal naar de directory waar het in staat en dan 'chmod +x filename.sh', en uitvoeren door ./filename.sh uit te voeren.
Niet perse natuurlijk, deze code kan je ook gewoon in terminal inkloppen en dan moet het ook werken. Maar in een file is het idd makkelijker, vooral als je moet gaan editten :)

Doe dit maar eens in een terminal:

enter() { echo "Enter the shell" }

en dan `which enter'

1
2
3
4
5
6
7
8
16:03 pts/9 0 wesleys@eniac:/home/wesleys$ enter() { echo "Enter the shell" }
16:03 pts/9 0 wesleys@eniac:/home/wesleys$ which enter
enter () {
        echo "Enter the shell"
}
16:03 pts/9 0 wesleys@eniac:/home/wesleys$ enter
Enter the shell
16:03 pts/9 0 wesleys@eniac:/home/wesleys$
whoopsdonderdag 17 januari 2008 @ 12:48
quote:
Op woensdag 16 januari 2008 14:17 schreef tony_clifton- het volgende:
Ah k
ingewikkeld!
De makkelijkste manier om dit te doen is overigens zo:

echo TVP

maar ik vond het leuk om een array met letters te maken, en deze 1 voor 1 uit te spugen.
tactic_tozaterdag 19 januari 2008 @ 00:23
even een tvp want dit is verdomdig handig.
slacker_nlwoensdag 13 februari 2008 @ 15:41
Een todo manager volledig in bash geschreven. Zie filmpje op de site voor de werking ervan. Het script zelf zit vol met sed commando's. Dus als je wilt debuggen, enjoy

http://todotxt.com/library/todo.sh/
whoopswoensdag 18 juni 2008 @ 22:48
Bashers!

Ik heb het volgende stuk code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/bin/bash

# Define backtitle
BACKTITLE="Nice message you got here!"

# Define header text
HEADER="This text acts like a header!"

# Define box format, Height, Width, List Height
SIZE_H=20
SIZE_W=50
SIZE_L=30

dialog --backtitle "$BACKTITLE" --checklist "$HEADER" $SIZE_H $SIZE_W $SIZE_L \
      "Choice 1" "Description One!"       ON  \
      "Choice 2" "Second Description!"    ON  \
      "Choice 3" "Third and Last!"       OFF \
      2> /tmp/checklist.tmp.$$

retval=$?

choice=`cat /tmp/checklist.tmp.$$`
rm -f /tmp/checklist.tmp.$$

case $retval in
  0)
    if [ -n "$choice" ]
    then
        echo "You chose: $choice"
    else
        echo "Can't choose?"
    fi;; 
  1)
    echo "Cancel pressed.";;
  255)
    echo "ESC pressed.";;
esac


Deze code print een lijst met keuzes d.m.v. Dialog. Dit werkt prima zo.

Ik zou echter graag de opties variabel willen maken, en dit lukt me niet. Ik heb al geprobeerd om de opties in een variabele te zetten, en deze als parameter van het dialog commando mee te geven, maar dat levert niet het gewenste resultaat op...

Anyone any clues?
slacker_nldonderdag 19 juni 2008 @ 01:21
Ff dit aanpassen in je voorbeeld, anders kan ik die checklist dialog niet maken..

1
2
3
4
# Define box format, Height, Width, List Height
SIZE_H=20
SIZE_W=50
SIZE_L=3
slacker_nldonderdag 19 juni 2008 @ 01:41
Gebruik van arrays :)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/bin/bash

# Define backtitle
BACKTITLE="'Nice message you got here!'"

# Define header text
HEADER="'This text acts like a header!'"

# Define box format, Height, Width, List Height
SIZE_H=20
SIZE_W=50
#SIZE_L=3

choices[0]="'Choice 1' 'Description one!' ON"
choices[1]="'Choice 2' 'Description two!' ON"
choices[2]="'Choice 3' 'Description three!' OFF"
choices[3]="'Choice 4' 'Description four!' ON"
choices[4]="'Choice 5' 'Description five!' ON"

SIZE_L=${#choices[@]}

for ((a=0; a < SIZE_L ; a++)); do
    line="$line ${choices[$a]}"
done

choice=$(eval dialog --stdout --backtitle $BACKTITLE --checklist $HEADER $SIZE_H $SIZE_W $SIZE_L $line);

retval=$?

case $retval in
  0)
    if [ -n "$choice" ]
    then
        echo "You chose: $choice"
    else
        echo "Can't choose?"
    fi;;
  1)
    echo "Cancel pressed.";;
  255)
    echo "ESC pressed.";;
esac
whoopsdonderdag 19 juni 2008 @ 09:58
Thanks dude, hier kan ik zeker wel wat mee...
whoopsdinsdag 24 juni 2008 @ 18:45
Ik heb 2 vragen.

1: is er een makkelijkere manier om $i met 1 op te hogen?

1i=`echo $((i+1))`


2: In onderstaande code wil ik een dot-file uit m'n homedir inlezen, ik kan deze waarde echter niet variabel maken. Hoe krijg ik dat voor elkaar?

1
2
3
4
5
6
7
8
9
10
#!/bin/bash

CONFIG_FILE_A='/home/whoops/.server-control'
CONFIG_FILE_B='~/.server-control'

echo $CONFIG_FILE_A
echo $CONFIG_FILE_B

if [ -f "$CONFIG_FILE_A" ]; then echo "A exists"; fi
if [ -f "$CONFIG_FILE_B" ]; then echo "B exists"; fi
slacker_nldinsdag 24 juni 2008 @ 19:24
quote:
Op dinsdag 24 juni 2008 18:45 schreef whoops het volgende:
Ik heb 2 vragen.

1: is er een makkelijkere manier om $i met 1 op te hogen?
[ code verwijderd ]
Je haalt nu twee dingen door elkaar;

i=`expr $i + 1`

en

i=$((i + 1))

Die echo is niet noodzakelijk in beide gevallen.
quote:
2: In onderstaande code wil ik een dot-file uit m'n homedir inlezen, ik kan deze waarde echter niet variabel maken. Hoe krijg ik dat voor elkaar?

[ code verwijderd ]
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

CONFIG_FILE_A="$HOME/.env.local"
CONFIG_FILE_B="~/.env.local"

for i in $CONFIG_FILE_A $CONFIG_FILE_B ; do
    if [ -f "$i" ]; then
        echo "'$i' exists";
        # Pick any
        . $i 
        source $i 
    fi
done


B pakt ie niet, maar dat komt wellicht omdat ie tijdens de test geen ~ expand naar je homedir, makkelijke workaround is $HOME gebruiken.. Zoals dus bij A gebeurd.
Iblisdinsdag 24 juni 2008 @ 19:44
quote:
Op donderdag 19 juni 2008 01:41 schreef slacker_nl het volgende:
Gebruik van arrays
[ code verwijderd ]
Dit is overigens heel erg niet-portable naar ‘sh’ op deze manier. Als je een shell-script moet maken dat onder sh werkt, kun je dit niet gebruiken (daar heb je andere trucs voor, met eval, maar daar begin ik liever niet over.)
slacker_nldinsdag 24 juni 2008 @ 19:47
quote:
Op dinsdag 24 juni 2008 19:44 schreef Iblis het volgende:

[..]

Dit is overigens heel erg niet-portable naar ‘sh’ op deze manier. Als je een shell-script moet maken dat onder sh werkt, kun je dit niet gebruiken (daar heb je andere trucs voor, met eval, maar daar begin ik liever niet over.)
Nu weet ik dat whoops 99,9% bash code schrijft, en ik weet ook dat ie in 99,99% geen sh compatible code nodig heeft

Maar hoe zou je dit, voor de lol, in sh compatibel code willen doen dan?

[ Bericht 5% gewijzigd door slacker_nl op 24-06-2008 19:56:14 ]
whoopsdinsdag 24 juni 2008 @ 20:31
quote:
Op dinsdag 24 juni 2008 19:24 schreef slacker_nl het volgende:
i=$((i + 1))
quote:
$HOME gebruiken
Dit waren degene die ik zocht, thanks slack...
Iblisdinsdag 24 juni 2008 @ 20:47
quote:
Op dinsdag 24 juni 2008 19:47 schreef slacker_nl het volgende:
Maar hoe zou je dit, voor de lol, in sh compatibel code willen doen dan?
Je moet dan ‘eval’ gebruiken. eval is een built-in commando dat de argumenten evalueert als waren ze een string in een shell-script.

B.v.

1
2
3
foo=bar
bar=baz
eval echo \$$foo


De eerste twee regels zijn duidelijk, de derde werkt als volgt: eerst worden de argumenten van het commando ‘eval’ geëvalueerd, dus dat wordt in feite:

1eval echo $bar


En dan wordt ‘echo $bar’ geëvalueerd, wat ‘baz’ levert. Zo gaat het ook met je arrays:

1
2
3
4
5
6
7
foo0="foo zero"
foo1="foo one"
foo2="foo two"
foo3="foo three"
for i in 0 1 2 3; do
        eval echo \$foo$i;
done;


Dit kan heel traag worden als je b.v. meerdere indices gebruikt, het eval-commando is namelijk vrij traag.
whoopsdinsdag 24 juni 2008 @ 22:46
quote:
Op dinsdag 24 juni 2008 20:47 schreef Iblis het volgende:

[..]

Je moet dan ‘eval’ gebruiken. eval is een built-in commando dat de argumenten evalueert als waren ze een string in een shell-script.

B.v.
[ code verwijderd ]

De eerste twee regels zijn duidelijk, de derde werkt als volgt: eerst worden de argumenten van het commando ‘eval’ geëvalueerd, dus dat wordt in feite:
[ code verwijderd ]

En dan wordt ‘echo $bar’ geëvalueerd, wat ‘baz’ levert. Zo gaat het ook met je arrays:
[ code verwijderd ]

Dit kan heel traag worden als je b.v. meerdere indices gebruikt, het eval-commando is namelijk vrij traag.
Het gebruiken van eval doet slacker ook al in zijn antwoord op mijn vraag hierboven...

Vanuit php heb ik trouwens altijd geleerd eval==evil en op zich denk ik dat ook wel... Toch gebruik ik het om mijn array mooi in dialog te krijgen. Als jij daar nog een manier zonder eval voor weet hou ik me aanbevolen...

De scripts die ik schrijf mogen inderdaad wel puur bash zijn, over het algemeen bouw ik ze voor een eigen gebruik, hoewel het het mooiste is om standaard te zijn...
slakkiewoensdag 25 juni 2008 @ 01:24
quote:
Op dinsdag 24 juni 2008 20:47 schreef Iblis het volgende:
Dit kan heel traag worden als je b.v. meerdere indices gebruikt, het eval-commando is namelijk vrij traag.
Ik had al het vermoeden dat je deze methode zou gaan gebruiken. Heb hem ook overwogen in eerste instantie, maar vond de array feature veel handiger Je kan makkelijker opties toevoegen, tenminste, je hoeft niet ook nog eens je for loop te definieren.

Maar we zijn stom bezig.... Terwijl ik bezig was om te kijken welke manier nou sneller was kwam ik op de uiteindelijke oplossing. Een soort van array push simuleren in bash. sh is twijfelachtig, $((i + i)) wordt volgens mij niet ondersteund.

1
2
3
4
5
6
7
8
9
10
function add_choice() {
    if [ -n "$1" ] ; then
        CHOICES="$CHOICES $1"
        LIMIT=$((LIMIT + 1))
        #LIMIT=`expr $LIMIT + 1`
    else
        CHOICES=""
        LIMIT=0
    fi
}


test_bash
real 0m0.005s
user 0m0.004s
sys 0m0.000s

test_sh
real 0m0.048s (schommelt tussen .024 - .050 bij herhaaldelijk aanroepen)
user 0m0.008s
sys 0m0.020s

test_choice
real 0m0.006s
user 0m0.008s
sys 0m0.000s

test_choice - met expr (schommelt tussen .045 - .070)
real 0m0.044s
user 0m0.036s
sys 0m0.008s

test_choice - sh compat
real 0m0.028s (schommelt tussen .014 - .030)
user 0m0.012s
sys 0m0.004s


De code
Jo0Lzdonderdag 28 augustus 2008 @ 11:37
Centraal.
RemcoDelftdonderdag 28 augustus 2008 @ 13:22
quote:
Op donderdag 28 augustus 2008 11:37 schreef Jo0Lz het volgende:
Centraal.
Goeie zaak, want ik had dit topic nog niet eerder opgemerkt!
quote:
Op maandag 14 januari 2008 11:22 schreef slacker_nl het volgende:
Big fucking warning
Ga nooit "leuk" zijn en mensen vertellen dat ze rm -rf /, moeten uitvoeren, dit wordt ZWAAR bestraft door de mods @hier en terecht. Voor de mensen die niet precies weten wat dit doet: rm -rf is een recursive, geforcede delete (rm == remove) actie op de root van je systeem. Mocht je als root zijn ingelogd dan verwijder je alle bestanden van je systeem en zal je snel merken dat je PC niet meer boot en je al je data kwijt bent. Mocht je een gewone user zijn en dit uitvoeren, dan heb je grote kans dat je homedir pleitte is, en andere bestanden buiten je $HOME, waar jij de eigenaar voor bent en/of group schrijfrechten voor hebt. Voer dit daarom dan ook NOOIT uit (tenzij je pijn leuk vind of als je in een virtuele omgeving zit waar dataverlies niet uitmaakt). Als we een post vinden waarin we dit zien, kijk er dan niet raar vanop dat je niet meer kan posten in DIG, of op heel Fok for that matter. U bent gewaarschuwd!
Het kan ook erger (spreek ik uit ervaring... 8)7 8)7 ):
1cd /tmp; rm -rf .*

Ooit wou ik alle files en directories die met een PUNT beginnen in /tmp opruimen (dit zijn de directories die o.a. X achterlaat). Echter, hierbij zag ik over het hoofd dat ".." op deze manier ook wordt meegenomen, en vanaf /tmp is ".." gelijk aan / ... Na enkele seconden viel het kwartje, omdat de delete-actie wel erg lang duurde, en heb ik CTRL-C gedaan. M'n userdata was nog veilig, maar m'n OS kon ik opnieuw installeren (en nee, m'n OS backup ik niet).
Ondertussen is "rm .*" zo slim om te zeggen dat-ie . en .. negeert :)
Moraal van het verhaal: Unix/Linux doet precies wat je zegt, maar pas altijd op wat je zegt :D
Iblisdonderdag 28 augustus 2008 @ 13:39
quote:
Op donderdag 28 augustus 2008 13:22 schreef RemcoDelft het volgende:
Ondertussen is "rm .*" zo slim om te zeggen dat-ie . en .. negeert
Moraal van het verhaal: Unix/Linux doet precies wat je zegt, maar pas altijd op wat je zegt
rm zelf doet niets met ‘.*’, het is de shell die zo’n pattern matcht en vervang door een lijst van bestanden die eraan voldoen. De Kornshell laat . en .. niet matchen op .*, bash echter soms wel, afhankelijk van de waarde van $GLOBIGNORE. Als je rm -rf .. intypt zal het nog steeds misgaan.

Bij zulke zaken is het dus goed om uit te zoeken wat de precieze semantiek van je shell is!
GBCHEATERdinsdag 23 september 2008 @ 00:29
Ik ben inmiddels weer vrolijk aan het bashen geslagen, ik zoek een manier om te kijken of ik in een string evenveel { en }; heb. Nu dacht ik, als ik nou de regex gebruik die ingebouwd zit in bash.

1
2
3
4
5
6
7
string="zone "asdf.asdf" {type master;file "/etc/bind/zones/asdf.asdf.db";allow-transfer{none;};};"
regex="};"
if [[ "$string" =~ $regex ]]; then
     echo "Jay, ik heb ${#BASH_REMATCH[*]} keer een }; gevonden";
else
     echo "He verdorie, niets..";
fi


echter komt hier altijd 1 uit.

Toen ben ik verder gaan zoeken, en toen had ik zoiets als dit
1
2
3
#get number of { and substract one.
nr=`echo "$string" | tr "{" "\n" | wc -l`
let nr=nr-1;


Dit werkt voor het { gedeelte van de twee. Voor de }; echter niet, ik denk dat dit komt omdat tr een match heeft per character in plaats van een tekenreeks.

Enig idee hoe ik of het }; gedeelte kan uitvissen, of hoe ik dit anders aan zou moeten pakken?
whoopsdinsdag 23 september 2008 @ 10:07
Volgens mij werkt je methode met tr en wc wel hoor.

1
2
3
4
5
$ string="en { dat { is { een { en { dat { is { twee en } dat } is } drie } en } dat } is } vier "
$ echo "$string" | tr "}" "\n" | wc -l
8
$ echo "$string" | tr "{" "\n" | wc -l
8


Ik zou overigens niet weten of het efficienter kan.
GBCHEATERdinsdag 23 september 2008 @ 13:13
quote:
Op dinsdag 23 september 2008 10:07 schreef whoops het volgende:
Volgens mij werkt je methode met tr en wc wel hoor.
[ code verwijderd ]

Ik zou overigens niet weten of het efficienter kan.
Klopt, echter is de sluit "tag" }; dus inclusief de ;

Als de ; op een volgende regel staat, moet deze meegenomen worden. Dus moet eerst de volgende regel ingelezen worden, waarna hij pas compleet is. Dus hij moet echt gematcht worden op "};"

Iblisdonderdag 25 september 2008 @ 08:23
In principe kun je met regexpen niet wat je hiermee wilt. Een regexp kan niet echt ‘tellen’ en niet kijken of haakjes gebalanceerd zijn. Je kunt het proberen, maar als je de string '{a{b}c{d}e}' hebt dan zal een regexp voor '{.*}' matchen op de gehele string als deze greedy is, of op '{a{b}' als deze lazy is. In het eerste geval zou je weer kunnen substring matchen, maar dan heb je eenzelfde probleem, omdat dan de match {b}c{d} wordt. (En een substring match op b}c{d niet gaat werken.)

Met veel kunst en vliegwerk is hier wel omheen te werken. De oplossing met ‘tr’ heeft een beetje een probleem dat het foute input als '}}{{' er niet uit kan halen. Ik weet niet of je dat wilt, maar anders is dit een probleem. Het makkelijkste is, als je het echt foutloos wilt doen, een klein perl of awk scriptje te schrijven dat de input simpelweg karakter voor karakter langsgaat en bij elke { de teller ophoogt, en bij elke } verlaagt. Als je teller < 0 komt, heb je te veel }, is deze > 0 bij het eind van de input heb je te veel { en is deze 0, dan zijn ze in balans. Verder kun je dus, als deze 0 is, de input afscannen naar ';'.

Weet je zeker dat de haakjes wel in balans zijn, dan zou je het volgende kunnen proberen:

1
2
3
4
5
6
7
8
9
string="en { dat { is { een {; en { dat { is { twee en } dat } is } drie } en } dat } is \n}\n; vier "
nstring=$(echo $string | tr -d -C '{};')
leftcount=$(echo $nstring | grep -o '{' | wc -l)
rightcount=$(echo $nstring | grep -o '}' | wc -l)
if echo "$nstring" | grep -q '};$' &&  test $leftcount -eq $rightcount; then
        echo 'bingo';
else
        echo 'jammer'
fi;


Eerst haal ik dus alle zooi uit de string behalve {, } en ; – ook de '\n's zijn dan weg. Dan tel ik linker en rechter haakjes (aannemende dat ze al in balans zijn). En dan moet de string met '};' eindigen.
GBCHEATERdonderdag 25 september 2008 @ 13:57
Hier ga ik morgen even mee aan de slag, even rondspelen met verschillende input combinaties, misschien werkt het, maar waarschijnlijk zit er nog een mogelijkheid in dat een blok (dus wat tussen de { en de }; zit) niet afgesloten kan zijn geweest.

Maar opzich maakt dat niet heel erg veel uit, aangezien BIND zelf dan gaat lopen mekkeren dat de syntax niet goed is.

Bedankt voor de mogelijke oplossing. Ik ben benieuwd

p.s. PERL is geen optie, omdat dit niet aanwezig is op het systeem (en niet geinstalleerd mag/kan worden)
Iblisdonderdag 25 september 2008 @ 16:40
Met AWK kun je nagenoeg hetzelfde als met Perl, zij het vaak iets minder beknopt. Zie onderstaande code. BEGIN wordt uitgevoerd voordat de input wordt gelezen, END altijd nadat alle input is gelezen, en het blok ertussen voor elke regel. Hij scant dus elke regel karakter voor karakter op '}', als de haakjes uit balans zijn komt er een error. Na de laatste } moet een ';' komen. Er is één catch, de input die alleen uit ';' bestaat wordt óók goedgekeurd. Daar kun je misschien expliciet op checken.

Je runt het met awk -f 'bestand' en kunt er dan gewoon via stdin input instoppen.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
BEGIN {
        counter = 0;
        done = 0;
}
{
        for (i = 1; i <= length($0); i++) {
                c = substr($0, i, 1);
                if (c== "{") {
                        counter++
                        done = 0;
                } else if (c == "}") {
                        if (counter == 0) {
                                print "Meer } dan { gevonden!";
                                exit 1;
                        }
                        counter--;
                } else if (c == ";" && counter == 0) {
                        done = 1;
                }
        }
}
END {
        if (counter > 0) {
                print "Enkele { zijn niet afgesloten!";
                exit 1;
        }
        if (!done) {
                print "Geen afsluitende ';' gevonden!"
                exit 1;
        }
        print "Alles in orde."
}
GBCHEATERzondag 28 september 2008 @ 21:52
quote:
Op donderdag 25 september 2008 16:40 schreef Iblis het volgende:
Met AWK kun je nagenoeg hetzelfde als met Perl, zij het vaak iets minder beknopt. Zie onderstaande code. BEGIN wordt uitgevoerd voordat de input wordt gelezen, END altijd nadat alle input is gelezen, en het blok ertussen voor elke regel. Hij scant dus elke regel karakter voor karakter op '}', als de haakjes uit balans zijn komt er een error. Na de laatste } moet een ';' komen. Er is één catch, de input die alleen uit ';' bestaat wordt óók goedgekeurd. Daar kun je misschien expliciet op checken.

Je runt het met awk -f 'bestand' en kunt er dan gewoon via stdin input instoppen.
[ code verwijderd ]


Bedankt voor de reactie, Ik probeer de Named.Conf.Local te parsen van BIND. Hierbij is het nodig dat ik fouten probeer te voorkomen waar dit mogelijk is. Voorbeeld van invoer:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
zone "asdf.asdf" {type master;file "/etc/bind/zones/asdf.asdf.db";allow-transfer{none;};};

Maar ook:

zone "asdf.net"
{

type master;
file "/etc/bind/zones/asdf.net.db";};

   zone "asdf.com" { //some comment here
        type master;
        file "/etc/bind/zones/asdf.com.db";
        allow-transfer


        {
                none;
}

;
};


Ik zoek het eerste gedeelte op met een regular expression, waardoor ik weet waar ik moet beginnen.
Daarna (is de bedoeling) dat ik bekijk dat ik na een { ook een bijbehorende }; heb. Wanneer dit zo is, weet ik dat ik de volledige zone heb. Wanneer dit niet zo is, lees ik de volgende regel in (verwijder ik whitespaces en comments), en bekijk ik verder of ik alles heb.

Hierdoor is het dus ook zo dat de ; 2 regels later kan komen.

Op dit moment heb ik (ongeveer) hetzelfde gedaan wat jij doet in die paar regels met awk, alleen dan ook met (basic) syntax checking.

Ik moet alleen nog bekijken hoe ik een newline kan matchen met een regular expression, aangezien na een } wel een spatie en een newline kan komen, maar geen ander teken moet ik hier rekening mee houden.

Wanneer de zone file naar de bagger is, moet het script stoppen en het niet erger maken :)

Ik zie dat je met awk redelijk veel kan doen, wist niet dat er zo een uitgebreide scripttaal achter zat..
Ibliszondag 28 september 2008 @ 21:58
Newlines in reguliere expressies matchen is meestal gewoon ‘\n’, maar veel tools scheiden impliciet op ‘\n’, zodat er dus nooit een ‘\n’ in je string komt. Als je dit weet echter kun je toch simpelweg (in termen van AWK) records inlezen, wat in de praktijk op regels neerkomt, en kijken of die records alleen spaties bevatten. Die records c.q. regels zelf moeten dan wel door ‘\n’ gescheiden zijn.
GBCHEATERmaandag 29 september 2008 @ 04:53
quote:
Op zondag 28 september 2008 21:58 schreef Iblis het volgende:
Newlines in reguliere expressies matchen is meestal gewoon ‘\n’, maar veel tools scheiden impliciet op ‘\n’, zodat er dus nooit een ‘\n’ in je string komt. Als je dit weet echter kun je toch simpelweg (in termen van AWK) records inlezen, wat in de praktijk op regels neerkomt, en kijken of die records alleen spaties bevatten. Die records c.q. regels zelf moeten dan wel door ‘\n’ gescheiden zijn.
Op dit moment ben ik niet zeker of het de newline character is wat zo loopt te klieren. Wanneer ik het wil echoen op het scherm, krijg ik gewoon een spatie, maar hij word niet gematcht door de \s teken. Ik zal wat meer debuggen en dan kom ik hier op terug.

Bedankt voor het meedenken iedereen
slacker_nldinsdag 23 december 2008 @ 14:22
Weet iemand hoe het komt dat bash hetvolgende doet;

1
2
3
bla=$(find . -print) 
echo $bla
. ./CS01.WANA-EAS.FI.2008.048.v02.csv ./CS01.BBDD-DSL.FI.2008.018.v02.csv ./rrd.ppt


Zsh doet dit, en dit is wat ik wil:
1
2
3
4
5
6
bla=$(find . -print) 
echo $bla
.
./CS01.WANA-EAS.FI.2008.048.v02.csv
./CS01.BBDD-DSL.FI.2008.018.v02.csv
./rrd.ppt



-edit-
echo "$bla" is de oplossing...

Zie http://wooledge.org:8000/WordSplitting

[ Bericht 5% gewijzigd door slacker_nl op 23-12-2008 14:33:24 ]
RemcoDelftdinsdag 23 december 2008 @ 14:38
Waarom find . -print? Doet dat niet hetzelfde als gewoon "find"?

Ik gebruik altijd zoiets, veel inzichtelijker:
for i in `find`; do echo $i; done
slacker_nldinsdag 23 december 2008 @ 14:41
quote:
Op dinsdag 23 december 2008 14:38 schreef RemcoDelft het volgende:
Waarom find . -print? Doet dat niet hetzelfde als gewoon "find"?

Ik gebruik altijd zoiets, veel inzichtelijker:
for i in `find`; do echo $i; done
Kan ook zonder de -print. Gebruik ze beide. Maar ik hoef niet over find te loopen.

Uit de man page van find:
quote:
If no expression is present, -print will be used as the
expression. Otherwise, if the given expression does not con-
tain any of the primaries -exec, -ok or -print, the given
expression will be effectively replaced by:

( given_expression ) -print
En als niet perse sh compatible code hoeft te schrijven $() is veel sneller dan backticks.

for i in $(find . ) ; do echo $i ; done
Iblisdinsdag 23 december 2008 @ 17:38
$() is ook gewoon POSIX. Je hebt dus sowieso een niet-POSIX shell te pakken als $() het niet doet. De vraag is in hoeverre je daar tegenwoordig nog rekening mee wilt houden.
slacker_nlwoensdag 24 december 2008 @ 13:31
Op solaris 8:

cat x.sh
#!/bin/sh

echo $(ls)

chmod +x x.sh
./x.sh
./x.sh: syntax error at line 3: `(' unexpected
slacker_nldonderdag 10 september 2009 @ 14:20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/bin/bash

TOTAL_MEM=0
TOTAL_PROC=0
DIV=$(perl -e 'print "-" x 40')

printf "%-10s %-18s %-10s\n" pid name anon_mem

echo $DIV

pgrep -lf "^ora_j"| sort -k2 | while read pid name junk ; do
    [ -z "$pid" ] && continue
    RES=$(pmap -x $pid 2>/dev/null)
    [ $? -ne 0 ] && continue
    RES=$(echo -e "$RES"  |tail -1 | awk '{NF=NF-1} {print $NF}' )
    printf "%-10d %-18s %-10d\n" $pid $name $RES
    TOTAL_MEM=$(($TOTAL_MEM + $RES))
    TOTAL_PROC=$((TOTAL_PROC +1 ))
    # Just for testing
    [ $TOTAL_PROC -eq 5 ] && break
done

TOTAL_MEM_GB=$(echo "scale = 4; ($TOTAL_MEM/1024)/1024"|bc)
echo $DIV
printf "TOTALS\n%-10s %-18s %-10s" procs "anon_mem kb" "anon_mem Gb"
echo $DIV

printf "%-10s %-18s %-10s\n" "$TOTAL_PROC" "$TOTAL_MEM" "$TOTAL_MEM_GB"


Waarom print ie niet m'n totalen uit??

Als ik
1pgrep -lf "^ora_j"| sort -k2 | while read pid name junk ; do

naar
1
2
3
for i in $(pgrep -lf "^ora_j"| sort -k2|sed -e 's/ /$/') ; do
pid=$(echo $i | cut -d\$ -f1)
name=$(echo $i | cut -d\$ -f2)


Werkt het wel... Why??
Iblisdonderdag 10 september 2009 @ 15:40
http://mywiki.wooledge.org/BashFAQ/024
whoopsdonderdag 10 september 2009 @ 15:45
quote:
Op donderdag 10 september 2009 14:20 schreef slacker_nl het volgende:

[ code verwijderd ]

Waarom print ie niet m'n totalen uit??

Als ik
[ code verwijderd ]

naar
[ code verwijderd ]

Werkt het wel... Why??
Gebruik dan ook geen bash maar zsh ofzo...
slacker_nldonderdag 10 september 2009 @ 16:05
@whoops
Spuit 11

@Iblis
Hehehe, held
ReWoutdonderdag 10 september 2009 @ 21:19
Is dit ook 't topic om te leren hoe je files verplaatst van map x naar map y en programma's opent via shell enzo?
Iblisdonderdag 10 september 2009 @ 21:23
quote:
Op donderdag 10 september 2009 21:19 schreef ReWout het volgende:
Is dit ook 't topic om te leren hoe je files verplaatst van map x naar map y en programma's opent via shell enzo?
Het is meer voor wat complexere scripts zou ik zeggen, er is ook [Linux/Unix] [/Gurus/helpen/newbies]$ ./deel 26 , maar goed, ik wil je wel helpen hoor als je hier je vraag stelt. Die andere topic gaat altijd over Gnome en KDE en zo.
xeonnnmaandag 18 januari 2010 @ 18:55
hoe laat je kleuren zien in de shell dan ?
Iblismaandag 18 januari 2010 @ 19:24
Zoek op bash colors. Je hebt b.v. hier een overzicht: http://wiki.archlinux.org/index.php/Color_Bash_Prompt

Je krijgt rode tekst door zoiets in te typen:

1$ echo -e '\e[0;31m' hoi


Let wel op, daarna blijft alles rood.
slacker_nldinsdag 2 februari 2010 @ 15:29
Denk dat iblis deze gaat beantwoorden

1
2
3
4
5
6
7
8
9
cmd_line=$(cat /proc/cmdline)
# Ziet er ongveer zo uit:
# BOOT_IMAGE=/boot/vmlinuz-2.6.32-trunk-686 root=UUID=fcdc06c1-729c-4991-817d-e7f94ce69dc6 ro quiet

# De oplossing in perl:
cmd_line=$(echo $cmd_line | perl -p -e 's#BOOT_IMAGE=\S+##')

# De beetje brakke oplossing met sed.. 
cmd_line=$(echo $cmd_line | sed -e 's#BOOT_IMAGE=.\+ root=#root=#'


Hoe krijg ik net zo'n mooie oplossing met sed als ik heb in perl?

While I was typing:

1
2
3
sed -e 's#BOOT_IMAGE=[[:punct:][:alnum:]]\+ ##'
# of mooier en meer lijkend op het perl ding:
sed -e 's#BOOT_IMAGE=[^[:space:]]\+ ##'


Toch jammer dat sed niet de \S kent zoals perl
Iblisdinsdag 2 februari 2010 @ 15:42
Je zegt het zelf al, maar daarbij:

Je kunt eventueel ook [^ <TAB>] doen, waarbij je voor <TAB> letterlijk een tab in je editor typt… maar dat is niet zo duidelijk. Die Perl-classes zoals \S en \s zijn echter geen POSIX, allicht dat sommige seds ze wel snappen, maar heel portable zal het niet zijn. Een letterlijke [^ <TAB>] is denk ik nog het meest portable.

Als je zeker weet dat er geen <TAB> wordt gebruikt voldoet [^ ] ook natuurlijk.
Daniel1976dinsdag 2 februari 2010 @ 15:47
Ik kan nog steeds posten hier.

Helaas weet ik niet meer wat ik hier boven had getikt wel jammer.

het zal wel een rm -Rf gewest zijn

Dan moet je de man pages maar doorlezen.
SinofEnvymaandag 1 maart 2010 @ 18:46
Hoe kan ik nou makkelijk een commando uitvoeren op een serie bestanden met nummers? Bijv ik heb File0001.jpg, File0002.jpg, File0003.jpg, etc en ik wil op ze allemaal touch uitvoeren. Het zal wel met een for-loop gaan ofzo, maar ik ben geen ster in bash scripting (ik kan met een shell overweg maar heb me nog nooit gewaagd aan shell scripts eigenlijk) dus als iemand dit me zou kunnen vertellen zou dat heel mooi zijn.
Iblismaandag 1 maart 2010 @ 18:55
Nu wil het toeval dat touch op meerdere files werkt, dus dan kun je simpelweg touch File*.jpg doen bijvoorbeeld. In het geval dat je iets wilt doen wat maar met één file tegelijk kan, b.v. resizen, dan doe je het inderdaad met een for-loop. Die ziet er zo uit:

1
2
3
for i in  do
   commando $i $i.out
done;


* wordt simpelweg geëxpandeerd tot een lijst van bestanden (zoals de shell altijd doet), en vervolgens wordt voor elk element in die lijst de code tussen do en done uitgevoerd waarbij $i de waarde heeft van dat element.

(Je kunt natuurlijk ook for j in *; of for bestand in *; doen, en verandert je variabele ook in b.v. $​bestand.)

Er is een aantal zaken waar je op moet letten, in het bijzonder wanneer de bestanden spaties bevatten. Wat dat betreft is het beter om in de loop "$i" te typen.

In jouw geval zou je het zo kunnen oplossen:


1
2
3
for i in File*jpg; do
   touch "$i"
done;


Hier een voorbeeld om b.v. thumbnails te maken:


1
2
3
for i in File*jpg; do
   convert "$i" -resize 20% th_"$i".jpg
done;


Dan krijg je een hele rits nieuwe bestanden genaamd th_File0000.jpg, th_File0001.jpg, enz.

Je kunt natuurlijk altijd experimenteren met 'echo' om te zien wat het commando uiteindelijk wordt, b.v.:

1
2
3
for i in File*jpg; do
   echo convert "$i" -resize 20% th_"$i".jpg
done;


En je kunt in de shell ook de boel op 1 regel typen als je wilt:

1for i in File*jpg; do touch "$i"; done;
SinofEnvymaandag 1 maart 2010 @ 20:35
Super, thanks! Ik neem aan dat in je eerste voorbeeld je for i in * bedoelt? Er staat namelijk for i in alleen.
Iblismaandag 1 maart 2010 @ 20:39
quote:
Op maandag 1 maart 2010 20:35 schreef SinofEnvy het volgende:
Super, thanks! Ik neem aan dat in je eerste voorbeeld je for i in * bedoelt? Er staat namelijk for i in alleen.
Oh ja. Foutje. Foutje van FOK! zelfs, er staat wel *; in de source, maar dat verdwijnt in een code omgeving.
-Mzraki-donderdag 4 maart 2010 @ 00:16
Ik weet niet of ik met deze vraag helemaal bij het goede adres ben, maar het komt wel in de buurt volgens mij

Ik heb in C een programma geschreven dat een model simuleert (Ising model, rooster met punten die +1 of -1 kunnen zijn), en dat werkt. Nu laat ik mijn programma het uiteindelijk gecreerde rooster gewoon printen met printf.

Om de evolutie van dit rooster echter goed te kunnen bekijken voldoet dit niet echt, het rooster staat zo namelijk niet vast in de terminal, hij scrollt naar boven. Het liefste zou ik mijn programma een apart scherm laten openen waar ik het rooster telkens opnieuw in kan printen, zodat als ik mijn simulatie laat lopen ik makkelijk kan zien hoe het zich ontwikkeld. In IDL zou ik dit wel kunnen, maar ik kan nergens vinden hoe ik zoiets in C kan programmeren.

Misschien is daar ook wel een commando voor in de terminal, net zoals dat ' > output.dat ' alle output naar dat bestandje wegschrijft. Weten jullie of zoiets bestaat?

Bij voorbaat dank in ieder geval!
Iblisdonderdag 4 maart 2010 @ 00:23
In principe is de terminal alleen iets waarop na elkaar geprint wordt. Je zult een soort clrscr-routine moeten zoeken m.b.v. een library zoals ncurses.
-Mzraki-donderdag 4 maart 2010 @ 00:30
Ja, iedere keer na een print het scherm clearen zou idd een idee zijn, maar hoe dat met die library te doen zie ik zo snel niet. Ik vraag het morgen wel even bij college, bedankt voor je antwoord in ieder geval!
Iblisdonderdag 4 maart 2010 @ 00:43
quote:
Op donderdag 4 maart 2010 00:30 schreef -Mzraki- het volgende:
Ja, iedere keer na een print het scherm clearen zou idd een idee zijn, maar hoe dat met die library te doen zie ik zo snel niet. Ik vraag het morgen wel even bij college, bedankt voor je antwoord in ieder geval!
Wat ook kan, want meestal blijft de terminal onderaan staan, is het rooster printen, en dan even wachten, en de volgende iteratie printen (moet het rooster wel telkens even groot zijn).

Dus zeg:

1
2
3
4
5
6
7
8
9
10
#include <unistd.h>

int main(void) {
   ...
   while(!done) {
     print_rooster();
     sleep(1); //1 seconde
               //of b.v.:
     usleep(500000); // 500000 microseconden
   }
-Mzraki-donderdag 4 maart 2010 @ 00:52
Ohja, das in ieder geval wel een makkelijke methode om het snel wat beter te maken, thx
Dale.zaterdag 18 december 2010 @ 21:38
Vraagje

Iemand enig idee hoe ik via shell het aantal bestanden tel wat zich in een ftp map bevindt (ben dus met ftp verbonden)?
RemcoDelftzaterdag 18 december 2010 @ 21:44
quote:
1s.gif Op zaterdag 18 december 2010 21:38 schreef Dale. het volgende:
Vraagje

Iemand enig idee hoe ik via shell het aantal bestanden tel wat zich in een ftp map bevindt (ben dus met ftp verbonden)?
Zelfs als je een getal terugkrijgt: wat wil je dat je ftp-client daarmee doet?
Heb je geen ssh-toegang, dat maakt het eenvoudiger.
Dale.zaterdag 18 december 2010 @ 21:51
quote:
1s.gif Op zaterdag 18 december 2010 21:44 schreef RemcoDelft het volgende:

[..]

Zelfs als je een getal terugkrijgt: wat wil je dat je ftp-client daarmee doet?
Heb je geen ssh-toegang, dat maakt het eenvoudiger.
Bestanden hernoemen, ssh toegang heb ik geloof ik wel (weet alleen niet hoe ik dat opzet, even uitzoeken)

Bestand01.jpg
Bestand02.jpg
...
Bestand**.jpg

Hernoemen naar

BestandWiii01.jpg
BestandWiii02.jpg
...
BestandWiii**.jpg
slacker_nlzondag 19 december 2010 @ 03:37
1rename -n 's/(Bestand)(\d+)/$1Wii$2/' Bestand*.jpg

Als je tevreden bent, -n weghalen en done :)
Je kan het ook met een for-loop doen, maar rename commando is handy :)
Dale.zondag 19 december 2010 @ 14:27
quote:
1s.gif Op zondag 19 december 2010 03:37 schreef slacker_nl het volgende:

[ code verwijderd ]

Als je tevreden bent, -n weghalen en done :)
Je kan het ook met een for-loop doen, maar rename commando is handy :)
Ty :*

Ander vraagje hoe upload ik een hele directoy naar ftp? Kan alleen bestanden verplaatsen maar geen dirs..?
PiRANiAzondag 19 december 2010 @ 14:32
quote:
1s.gif Op zondag 19 december 2010 14:27 schreef Dale. het volgende:

[..]

Ty :*

Ander vraagje hoe upload ik een hele directoy naar ftp? Kan alleen bestanden verplaatsen maar geen dirs..?
Google even op lftp (mirror)
Dale.zondag 19 december 2010 @ 14:56
quote:
1s.gif Op zondag 19 december 2010 14:32 schreef PiRANiA het volgende:

[..]

Google even op lftp (mirror)
Ty :* vraagje aan Slacker nog

1rename -n 's/(Bestand)(\d+)/$1Wii$2/' Bestand*.jpg

Kun je de regel uitleggen? Waarvoor staat die -n s/ $1 en $2 enzo :@?

Weet dat -n flag is (weet niet echter wat die doet
\d+ is decimaal of meer
* is wildcard.


Oh wacht gewoon regex toch?
slacker_nlzondag 19 december 2010 @ 15:33
quote:
1s.gif Op zondag 19 december 2010 14:56 schreef Dale. het volgende:

[..]

Ty :* vraagje aan Slacker nog

[ code verwijderd ]

Kun je de regel uitleggen? Waarvoor staat die -n s/ $1 en $2 enzo :@?

Weet dat -n flag is (weet niet echter wat die doet
\d+ is decimaal of meer
* is wildcard.


Oh wacht gewoon regex toch?
Het is gewoon een perl regexp ja, die -n is dat ie laat zien wat ie zou doen, zonder het daadwerkelijk te doen.
RemcoDelftzondag 19 december 2010 @ 15:48
quote:
1s.gif Op zondag 19 december 2010 14:27 schreef Dale. het volgende:

[..]
Ander vraagje hoe upload ik een hele directoy naar ftp? Kan alleen bestanden verplaatsen maar geen dirs..?
Mijn persoonlijke voorkeur is tegenwoordig scp (ssh-toegang vereist):

scp -r /home/user/directory username@example.com:/home/andereusername/subdirectory # :)
Dale.zondag 19 december 2010 @ 16:47
quote:
1s.gif Op zondag 19 december 2010 15:33 schreef slacker_nl het volgende:

[..]

Het is gewoon een perl regexp ja, die -n is dat ie laat zien wat ie zou doen, zonder het daadwerkelijk te doen.
Hmmm die -n flag doet het volgens mij niet bij me :?

1
2
3
4
-rw-r--r--   1 admin    administrators  5693125 Dec 19 16:36 Morningwood - Nth Degree.mp3
226 Transfer complete
ftp> rename -n "Morningwood - Nth Degree.mp3" "test.mp3"
550 -n: No such file or directory
slacker_nlzondag 19 december 2010 @ 17:40
dat werkt niet met ftp nee, ssh toegang is wel een vereiste :)
Dale.zondag 19 december 2010 @ 18:58
quote:
1s.gif Op zondag 19 december 2010 17:40 schreef slacker_nl het volgende:
dat werkt niet met ftp nee, ssh toegang is wel een vereiste :)
ok en hoe krijg ik dat? Vind alleen maar lange manuals :@ waar ik niet veel zin heb om die helemaal door te lezen.
Joooo-pizondag 19 december 2010 @ 19:18
quote:
1s.gif Op zondag 19 december 2010 18:58 schreef Dale. het volgende:

[..]

ok en hoe krijg ik dat? Vind alleen maar lange manuals :@ waar ik niet veel zin heb om die helemaal door te lezen.
Als je server ssh draait, dan vanuit windows met putty of vanuit linux gewoon vanuit de terminal:

$ ssh inlognaam@ip-van-server
Dale.zondag 19 december 2010 @ 21:21
quote:
99s.gif Op zondag 19 december 2010 19:18 schreef Joooo-pi het volgende:

[..]

Als je server ssh draait, dan vanuit windows met putty of vanuit linux gewoon vanuit de terminal:

$ ssh inlognaam@ip-van-server
Ah thanks dat is eenvoudig.
Dale.maandag 27 december 2010 @ 22:46
quote:
1s.gif Op zondag 19 december 2010 15:33 schreef slacker_nl het volgende:

[..]

Het is gewoon een perl regexp ja, die -n is dat ie laat zien wat ie zou doen, zonder het daadwerkelijk te doen.
Vraagje... hoe verplaats ik

"Home Alone.mkv.part01.rar"

naar

"Home Alone/Home Alone.mkv.part01.rar"

ps. wanneer ik met ssh ingelogd ben bestaat de commando rename trouwens niet eens... en mv kent de optie -n niet.
slacker_nlmaandag 27 december 2010 @ 23:10
quote:
1s.gif Op maandag 27 december 2010 22:46 schreef Dale. het volgende:

[..]

Vraagje... hoe verplaats ik

"Home Alone.mkv.part01.rar"

naar

"Home Alone/Home Alone.mkv.part01.rar"

ps. wanneer ik met ssh ingelogd ben bestaat de commando rename trouwens niet eens... en mv kent de optie -n niet.
mkdir "Home Alone" ; mv "Home Alone.mkv.part01.rar" "Home Alone/Home Alone.mkv.part01.rar"

Kan te maken hebben met je PATH, maar zou ook kunnen zijn dat het niet installed is.
Dale.maandag 27 december 2010 @ 23:22
quote:
1s.gif Op maandag 27 december 2010 23:10 schreef slacker_nl het volgende:

[..]

mkdir "Home Alone" ; mv "Home Alone.mkv.part01.rar" "Home Alone/Home Alone.mkv.part01.rar"

Kan te maken hebben met je PATH, maar zou ook kunnen zijn dat het niet installed is.
ah ja sorry maar bedoel natuurlijk alle parts iets van 50 ofzo :+ dus dat hij alle .rar's verplaatst, niet enkel 01.
PiRANiAmaandag 27 december 2010 @ 23:23
quote:
1s.gif Op maandag 27 december 2010 23:22 schreef Dale. het volgende:

[..]

ah ja sorry maar bedoel natuurlijk alle parts iets van 50 ofzo :+ dus dat hij alle .rar's verplaatst, niet enkel 01.
mv Home\ Alone.mkv.part*.rar Home\ Alone/

?
Dale.woensdag 12 januari 2011 @ 13:44
quote:
1s.gif Op zondag 19 december 2010 17:40 schreef slacker_nl het volgende:
dat werkt niet met ftp nee, ssh toegang is wel een vereiste :)
Hmmmm ik heb nu via ssh admin@<ip> ssh geopend alleen wanneer ik de commando rename uitvoer zegt die dat hij die niet kent...
Blinkerwoensdag 12 januari 2011 @ 14:07
quote:
1s.gif Op woensdag 12 januari 2011 13:44 schreef Dale. het volgende:

[..]

Hmmmm ik heb nu via ssh admin@<ip> ssh geopend alleen wanneer ik de commando rename uitvoer zegt die dat hij die niet kent...
Rename commando bestaat ook niet voor Linux. Normaliter doe je het met het 'mv' commando (move)

Voorbeeld:

blinker@ubuntu:~$ mv test test2

Zo hernoemt hij het bestand test naar test2.

Kijk hier voor meer linux commands: http://ss64.com/bash/
slacker_nlwoensdag 12 januari 2011 @ 16:21
quote:
1s.gif Op woensdag 12 januari 2011 14:07 schreef Blinker het volgende:

[..]

Rename commando bestaat ook niet voor Linux. Normaliter doe je het met het 'mv' commando (move)

Voorbeeld:

blinker@ubuntu:~$ mv test test2

Zo hernoemt hij het bestand test naar test2.

Kijk hier voor meer linux commands: http://ss64.com/bash/
pssst
Blinkerwoensdag 12 januari 2011 @ 20:37
quote:
1s.gif Op woensdag 12 januari 2011 16:21 schreef slacker_nl het volgende:

[..]

pssst
Haha, nooit geweten! Moet zeggen dat ik mij altijd goed heb gered met mv :P
Dale.woensdag 12 januari 2011 @ 21:22
Ja maar rename doet het nog steeds niet op ssh en bij ssh kent mv de optie -v niet waardoor ik niet eerst de output te zien krijg?
slacker_nlwoensdag 12 januari 2011 @ 22:27
quote:
1s.gif Op woensdag 12 januari 2011 21:22 schreef Dale. het volgende:
Ja maar rename doet het nog steeds niet op ssh en bij ssh kent mv de optie -v niet waardoor ik niet eerst de output te zien krijg?
dan doe je echo "mv stuff daar" en dan zie je wat je zou doen :)
PiRANiAdonderdag 29 september 2011 @ 22:19
Ik ga deze weer eens schoppen. Zonder reden.

Hebben mensen nog interessante scriptjes? :9.
RemcoDelftdonderdag 29 september 2011 @ 22:53
quote:
14s.gif Op donderdag 29 september 2011 22:19 schreef PiRANiA het volgende:
Hebben mensen nog interessante scriptjes? :9.
Ik kwam diverse (denk aan Apple) TimeMachine-achtige oplossingen tegen die allemaal niet doen wat ik precies wil. Nu heb ik er zelf maar eentje gemaakt: een simpel scriptje dat ik handmatig opstart. Het doet dit:
-maak een directory in /home2/TimeMachineBackup met datum en tijd in de naam
-kopieer de opgegeven mappen daarnaartoe
-vergelijk (m.b.v. fdupes) alle dubbele files met de vorige versie, en hardlink alle duplicates. Fdupes kijkt niet naar filenames/locaties, maar alleen naar de inhoud van de files.

Voordelen: ik heb nu een backup waarin ik oudere versies van al mijn files kan terugvinden, terwijl een nieuwe backupdatum nauwelijks diskruimte kost.
Nadeel: bruut alles kopieren en daarna vergelijken zorgt voor enkele uren actief harddiskgebruik, bij voorkeur doen als ik de PC niet nodig heb dus.

Voor de liefhebbers in de simpelste vorm (zelf aanpassen naar behoefte, zorg dat je weet wat je doet, ik geef GEEN garanties!):
1
2
3
4
5
6
#!/bin/bash
backupdir=/andereharddisk/TimeMachineBackup/`date +%Y_%m_%d_%a_%H:%Mh`
mkdir -p $backupdir; cd $backupdir/..
oudebackupdir=`ls -rt | tail -n 2 | head -n 1`
cp -a /home/userdir/data $backupdir
fdupes -rL $oudebackupdir/data $backupdir/data
slacker_nlvrijdag 30 september 2011 @ 07:39
Mijn rmkernel script. Getest op Debian en Ubuntu, maar werkt denk ik ook op andere Debian based systemen.
Black_Ninjadinsdag 8 mei 2012 @ 11:21
Via een doorverwijzing even mijn vraag hier posten :)

Hoeveel werk is het om dit commando te laten uitvoeren?

1    VBoxManage startvm "vm" --type headless

Ik wil het eigenlijk in een cronjob zetten zodat hij controleert of de Vbox al draait en zo nee, dan opstarten, zo ja dan zo laten.

en op die Vbox zelf moet hij ook nog wat dingen doen, namelijk:

1~/run_replication.sh
en
1./run_server.sh

Beide moeten eigenlijk worden gecontroleerd of ze runnen 1x per uur ofzo en daarnaast moet ie 1x per dag
1sudo shutdown now
uitvoeren zodat hij de gegevens van die dag opslaat en dan via dat controle scriptje op de echte machine binnen een uurtje weer opstarten :)
slacker_nldinsdag 8 mei 2012 @ 11:28
Dus die run_replication and run_server moeten 1x per uur binnen de vbox instance gedraaid worden en de shutdown moet 1x per dag gedaan worden?

Dat is allemaal via een cronjob te regelen: man crontab

Dat andere, je moet even kijken of vboxmanage ook een status optie heeft, dan kan je dat relatief makkelijk scripten.

Ik zou er gewoon een soort van init script van maken, met start, stop, restart, status functies, dan kan je het zo leuk maken als je zelf wilt.
Black_Ninjadinsdag 8 mei 2012 @ 11:30
quote:
0s.gif Op dinsdag 8 mei 2012 11:28 schreef slacker_nl het volgende:
Dus die run_replication and run_server moeten 1x per uur binnen de vbox instance gedraaid worden en de shutdown moet 1x per dag gedaan worden?

Dat is allemaal via een cronjob te regelen: man crontab

Dat andere, je moet even kijken of vboxmanage ook een status optie heeft, dan kan je dat relatief makkelijk scripten.

Ik zou er gewoon een soort van init script van maken, met start, stop, restart, status functies, dan kan je het zo leuk maken als je zelf wilt.
Het commando van die Vbox is zoals ik het zelf in de commandline ingeef om hem op te starten dus ik weet dat dat werkt maar om een of andere reden als ik die regel in een cronjob of in rc.local zet dan gebeurd er niks.

Als ik die .sh dingen in een cronjob wil zetten, kan ik dan gewoon dat commando zoals het daar staat er in zetten of moet ik het dan op een andere manier aanroepen? :@
slacker_nldinsdag 8 mei 2012 @ 11:35
Je moet het volledige path gebruiken.

Bijvoorbeeld als je aptitude update vanuit de cron gaat draaien krijg je dit:

10 0 * * * /usr/bin/aptitude update &>/dev/null

Als je zelf een script schrijft moet je zorgen dat je PATH in je script gedefinieerd is.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ sudo crontab -l
[snip]
*/5 * * * *  /usr/local/bin/vnstat_all
$ cat /usr/local/bin/vnstat_all
#!/usr/bin/env bash

PATH=/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin

vnstat=/usr/bin/vnstat

[ ! -x $vnstat ] && echo "Unable to run $vnstat" >&2 && exit 1

for int in $(ifconfig | grep "^[^ ]" | awk '{print $1}') ; do
    $vnstat --force -u -i $int
done

En uiteraard ook je script chmodden :)

Maar begin simpel met gewoon het starten van vbox binnen een script, daarna met ps kijken of je instance draait, en dan op basis daarvan een start en status functie schrijven. Daarna kan je redelijk simpel een init script maken en die kan je gebruiken in de cron.

Tevens: http://www.virtualbox.org/manual/ch07.html#vboxheadless

[ Bericht 5% gewijzigd door slacker_nl op 08-05-2012 11:41:49 ]
Black_Ninjadinsdag 8 mei 2012 @ 11:41
quote:
0s.gif Op dinsdag 8 mei 2012 11:35 schreef slacker_nl het volgende:
Je moet het volledige path gebruiken.

Bijvoorbeeld als je aptitude update vanuit de cron gaat draaien krijg je dit:
[ code verwijderd ]

Als je zelf een script schrijft moet je zorgen dat je PATH in je script gedefinieerd is.
[ code verwijderd ]

En uiteraard ook je script chmodden :)
Sorry ik probeer zo snel mogelijk alles onder de knie te krijgen maar ik ben nogsteeds een groentje hiermee :@

1/usr/lib/virtualbox/VBoxManage startvm "vm" --type headless
Zou dat voldoende moeten zijn in rc.local?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

/usr/local/bin/./lamppstart.sh
/usr/lib/virtualbox/VBoxManage startvm "vm" --type headless

exit 0

:@

Want dit doet hij dus niet :@
slacker_nldinsdag 8 mei 2012 @ 11:44
quote:
0s.gif Op dinsdag 8 mei 2012 11:41 schreef Black_Ninja het volgende:

[..]

Sorry ik probeer zo snel mogelijk alles onder de knie te krijgen maar ik ben nogsteeds een groentje hiermee :@
[ code verwijderd ]

Zou dat voldoende moeten zijn in rc.local?
[ code verwijderd ]

:@

Want dit doet hij dus niet :@
Waarom doet ie het niet? Haal het uit rc.local en maak er een apart iets van, dan kan je dat aparte ding in rc3.d zetten en ook nog los gebruiken op de commandline, aka /etc/init.d/vboxheadless start|status etc.

Dit is zeg maar iets wat ik voor bind heb getikt, zoiets moet jij ook gaan doen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ cat /etc/bind/tools/bind.sh 
#!/usr/bin/env bash

start() {
    /etc/init.d/bind9 start
}

stop() {
    pkill -f /usr/sbin/named
}

status() {
   pgrep -lf /usr/sbin/named
}

restart() {
    stop
    sleep 2
    start
}

case $1 in
    start|stop|restart|status) $1;;
    *) echo "Usage: $(basename $0) <start|stop|restart|status>";;
esac
Black_Ninjadinsdag 8 mei 2012 @ 11:50
quote:
0s.gif Op dinsdag 8 mei 2012 11:44 schreef slacker_nl het volgende:

[..]

Waarom doet ie het niet? Haal het uit rc.local en maak er een apart iets van, dan kan je dat aparte ding in rc3.d zetten en ook nog los gebruiken op de commandline, aka /etc/init.d/vboxheadless start|status etc.

Dit is zeg maar iets wat ik voor bind heb getikt, zoiets moet jij ook gaan doen:
[ code verwijderd ]

Ja dat begrijp ik dus ook niet waar hij het niet doet ;(

Maar als ik het nu allemaal in een cronjob prop, zou het dan allemaal zo extreem ingewikkeld moeten zijn? :@

Als ik in de cronjob een @reboot commando plaats om de VM te starten na een reboot en dan op een vast tijdstip de VM laat afsluiten en dan op een vast tijdstip 2 minuten later de VM weer laat opstarten ben ik er ook.

Zou je misschien een voorbeeld kunnen geven hoe het er volgens jou in cronjob uit zou moeten zien? :@
Black_Ninjadinsdag 8 mei 2012 @ 17:46
ARG!!!

Ik heb dus nu een scriptje gemaakt, als ik het handmatig uitvoer werkt het wel, in de cronjob niet!

Verder heb ik het nu wel zo ver dat als de VM machine opstart hij wel het replication script uitvoert maar hij start nogsteeds de webserver niet op! :?
PiRANiAdinsdag 8 mei 2012 @ 18:58
quote:
0s.gif Op dinsdag 8 mei 2012 17:46 schreef Black_Ninja het volgende:
ARG!!!

Ik heb dus nu een scriptje gemaakt, als ik het handmatig uitvoer werkt het wel, in de cronjob niet!

Verder heb ik het nu wel zo ver dat als de VM machine opstart hij wel het replication script uitvoert maar hij start nogsteeds de webserver niet op! :?
Kan aan path en environment vars liggen.
Black_Ninjadinsdag 8 mei 2012 @ 19:25
quote:
3s.gif Op dinsdag 8 mei 2012 18:58 schreef PiRANiA het volgende:

[..]

Kan aan path en environment vars liggen.
:@ zou je dat een beetje kunnen toelichten? :@
PiRANiAdinsdag 8 mei 2012 @ 19:29
quote:
0s.gif Op dinsdag 8 mei 2012 19:25 schreef Black_Ninja het volgende:

[..]

:@ zou je dat een beetje kunnen toelichten? :@
Post je script eens ;)
Black_Ninjadinsdag 8 mei 2012 @ 19:29
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
@reboot /home/media/startscripje.sh
@hourly /home/media/startscripje.sh

1
2
3
4
#!/bin/bash
clear

/usr/lib/virtualbox/VBoxManage startvm "vm" --type headless

Even mijn codes toegevoegd :@
Black_Ninjadinsdag 8 mei 2012 @ 19:29
quote:
3s.gif Op dinsdag 8 mei 2012 19:29 schreef PiRANiA het volgende:

[..]

Post je script eens ;)
Was al onderweg :)
NightH4wkdinsdag 8 mei 2012 @ 19:29
http://www.wonkity.com/~wblock/docs/html/interrupted.html

Nummer 2 van de interrupted Unix FAQ.
NightH4wkdinsdag 8 mei 2012 @ 19:30
Ah, te laat.
Black_Ninjadinsdag 8 mei 2012 @ 19:33
quote:
0s.gif Op dinsdag 8 mei 2012 19:29 schreef NightH4wk het volgende:
http://www.wonkity.com/~wblock/docs/html/interrupted.html

Nummer 2 van de interrupted Unix FAQ.
Dat doe ik toch goed? :@
PiRANiAdinsdag 8 mei 2012 @ 19:33
quote:
0s.gif Op dinsdag 8 mei 2012 19:29 schreef Black_Ninja het volgende:

[ code verwijderd ]

[ code verwijderd ]

Even mijn codes toegevoegd :@
1
2
3
4
5
6
7
$ /usr/lib/virtualbox/VBoxManage list vms
"ZoneCD" {fc21749e-413d-4054-a498-2307ed8c785d}
"Android" {bd77113d-9194-4d8e-a6ee-fb301a2a9ee5}
$ sudo /usr/lib/virtualbox/VBoxManage list vms
$ sudo -u mijnusername /usr/lib/virtualbox/VBoxManage list vms
"ZoneCD" {fc21749e-413d-4054-a498-2307ed8c785d}
"Android" {bd77113d-9194-4d8e-a6ee-fb301a2a9ee5}

Het VBoxManage command hangt dus af van de user. Voer je de cron als root uit?
NightH4wkdinsdag 8 mei 2012 @ 19:34
quote:
Dat doe ik toch goed?
Idd. Daarom te laat. :X
Black_Ninjadinsdag 8 mei 2012 @ 19:35
quote:
14s.gif Op dinsdag 8 mei 2012 19:33 schreef PiRANiA het volgende:

[..]
[ code verwijderd ]

Het VBoxManage command hangt dus af van de user. Voer je de cron als root uit?
Je ziet mijn code, volgens mij roep ik het gewoon aan maar het vreemde is dat ik hem niet met sudo hoef te starten als ik het handmatig doe :?

Als ik hem als root wil starten, hoe moet ik het dan invoeren? :@
Black_Ninjadinsdag 8 mei 2012 @ 19:35
quote:
0s.gif Op dinsdag 8 mei 2012 19:34 schreef NightH4wk het volgende:

[..]

Idd. Daarom te laat. :X
Gelukkig :) Doe ik iedergeval iets goed :P
Black_Ninjadinsdag 8 mei 2012 @ 19:52
quote:
14s.gif Op dinsdag 8 mei 2012 19:33 schreef PiRANiA het volgende:

[..]
[ code verwijderd ]

Het VBoxManage command hangt dus af van de user. Voer je de cron als root uit?
In cron root werkt het ook niet ;(
slacker_nldinsdag 8 mei 2012 @ 20:50
su - $user -c "/path/to/cmd" of is het -e?!
Black_Ninjadinsdag 8 mei 2012 @ 21:15
*O* *O* *O* *O* *O* *O* *O* *O* *O* *O*
Ik heb de Virtualbox werkende :D

Om een of andere reden doet hij het niet met het @reboot commando maar dan kan ik omheen werken omdat ik hem op vaste tijdstippen kan herstarten :)

Nu zit ik alleen nog met probleem 2. De .sh scripts op de virtualbox -O-

Het script dat ik start met
1~/run_replication.sh
werkt prima

Het script dat ik start met
1./run_server.sh
werkt dus niet ;(

Hoe moet ik het ./ gedeelte in een cronjob zetten? :@
slacker_nldinsdag 8 mei 2012 @ 21:41
Volledige path gebruiken..
Black_Ninjadinsdag 8 mei 2012 @ 21:53
quote:
0s.gif Op dinsdag 8 mei 2012 21:41 schreef slacker_nl het volgende:
Volledige path gebruiken..
helpt niet ;(
slacker_nldinsdag 8 mei 2012 @ 21:58
Dan heb ik een pro-tip. set -x gebruiken en dan 2>> /tmp/logfile redirecten :)

Dan krijg je debug info in een log, kek :)
Black_Ninjadinsdag 8 mei 2012 @ 22:30
quote:
0s.gif Op dinsdag 8 mei 2012 21:58 schreef slacker_nl het volgende:
Dan heb ik een pro-tip. set -x gebruiken en dan 2>> /tmp/logfile redirecten :)

Dan krijg je debug info in een log, kek :)
log blijft leeg maar wordt wel aangemaakt :?
slacker_nldinsdag 8 mei 2012 @ 22:31
uhh &2>> logfile
Black_Ninjadinsdag 8 mei 2012 @ 23:11
Echt, wtf!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
*/1 * * * * danny -u /home/musicbrainz/run_server.sh
10 * * * * /home/musicbrainz/run_replication.sh >> /tmp/replication.log 2>&1
@reboot /home/musicbrainz/run_replication.sh
46 * * * * /home/musicbrainz/run_server.sh >> /home/musicbrainz/startserver.log

run_replication.sh werkt prima, runs_server.sh pakt ie niet.

het enige verschil van wat ik weet is dat run_replication.sh start je met ~/ er voor en run_server.sh met ./

begin echt gek te worden :(
slacker_nldinsdag 8 mei 2012 @ 23:16
~/ werkt niet, dan moet je $HOME gebruiken. Volgens mij staat dat ook ergens in deze draad :) Jep: you@shellscripts$ enter() { echo "Shell scripting ftw!, deel 1
Black_Ninjadinsdag 8 mei 2012 @ 23:21
quote:
0s.gif Op dinsdag 8 mei 2012 23:16 schreef slacker_nl het volgende:
~/ werkt niet, dan moet je $HOME gebruiken. Volgens mij staat dat ook ergens in deze draad :) Jep: you@shellscripts$ enter() { echo "Shell scripting ftw!, deel 1
run_replication werkt dus, en die moest met ~/ worden gestart

het is run_server.sh dat niet werkt en die werd gestart met ./

:? :? :? :? :? :? :? :? :?
slacker_nldinsdag 8 mei 2012 @ 23:23
DUDE STOP FUCKING WITH RELATIVES PATHS!!!!! ABSOLUTE PATHS PLEASE!!!!!!
Black_Ninjadinsdag 8 mei 2012 @ 23:25
quote:
0s.gif Op dinsdag 8 mei 2012 23:23 schreef slacker_nl het volgende:
DUDE STOP FUCKING WITH RELATIVES PATHS!!!!! ABSOLUTE PATHS PLEASE!!!!!!
Die werken dus ook niet! :P

Ik heb als eerste
1/home/musicbrainz/run_server.sh
geprobeerd maar dat deed niks, als ik die handmatig intik werkt het prima.
slacker_nldinsdag 8 mei 2012 @ 23:27
Dan moet je chmodden en/of je #! aanpassen en/of je PATH variabele in je script goed zetten. Niet werken is niet zo een duidelijke omschrijving ;)
NightH4wkdinsdag 8 mei 2012 @ 23:29
Weet je zeker dat het probleem niet in in .sh files zit? Environment variabelen worden overschreven. Dus vervang run_server.sh door run_replication.sh en kijk of de cron hem iig wel aanroept.
Black_Ninjadinsdag 8 mei 2012 @ 23:31
quote:
0s.gif Op dinsdag 8 mei 2012 23:27 schreef slacker_nl het volgende:
Dan moet je chmodden en/of je #! aanpassen en/of je PATH variabele in je script goed zetten. Niet werken is niet zo een duidelijke omschrijving ;)
Als ik meer info had zou ik het graag geven :@

quote:
0s.gif Op dinsdag 8 mei 2012 23:29 schreef NightH4wk het volgende:
Weet je zeker dat het probleem niet in in .sh files zit? Environment variabelen worden overschreven. Dus vervang run_server.sh door run_replication.sh en kijk of de cron hem iig wel aanroept.
run_replication.sh staat in dezelfde map als run_server.sh dat is dus allemaal zo vreemd :@
NightH4wkdinsdag 8 mei 2012 @ 23:38
quote:
run_replication.sh staat in dezelfde map als run_server.sh dat is dus allemaal zo vreemd
Maar wordt het script dus aangeroepen? Indien dat het geval is dat zit het probleem in de .sh.
Black_Ninjadinsdag 8 mei 2012 @ 23:40
quote:
0s.gif Op dinsdag 8 mei 2012 23:38 schreef NightH4wk het volgende:

[..]

Maar wordt het script dus aangeroepen? Indien dat het geval is dat zit het probleem in de .sh.
net het even omgedraaid en ook dan wordt replication wel aangeroepen en server niet.

als ik mijn eigen scriptje gebruik dan kan ik hem ook handmatig wel en niet via cronjob aanroepen. Moet ik heb dan speciale chmod rechten meegeven of iets dergelijks?
Black_Ninjawoensdag 9 mei 2012 @ 09:50
Inmiddels weer een stapje verder. Als ik run_server.sh opstart zie ik het een en ander gebeuren (hij geeft weer welke communicatie er plaats vind). Wanneer ik dan het ssh venster sluit sluit ook direct het script.

Ik zal hem dus als een soort daemon process moeten draaien denk ik, kan iemand me op weg helpen hoe ik dat moet doen? :@
gebrokenglaswoensdag 9 mei 2012 @ 10:00
quote:
0s.gif Op woensdag 9 mei 2012 09:50 schreef Black_Ninja het volgende:
Inmiddels weer een stapje verder. Als ik run_server.sh opstart zie ik het een en ander gebeuren (hij geeft weer welke communicatie er plaats vind). Wanneer ik dan het ssh venster sluit sluit ook direct het script.

Ik zal hem dus als een soort daemon process moeten draaien denk ik, kan iemand me op weg helpen hoe ik dat moet doen? :@
Als je een script autonoom wilt draaien, kan dat op 2 manieren


methode 1: nohup

Zoiets:
1
2
3
4
5
cd /tmp/
[ -f nohup.out ] && rm nohup.out
[ -f run_server.sh.log ] && rm run_server.sh.log
nohup /home/musicbrainz/run_server.sh &
mv nohup.out run_server.sh.log
Ouput komt dan in een /tmp/run_server.sh.log file terecht, maar je scherm kun je rustig sluiten.


methode 2: at
at is een mechanisme a la cron, om dingen op een later tijdstip uit te voeren.
Bijvoorbeeld het starten van een scriptje om 12 uur 's middags:
1
2
3
at 12pm
/home/bla/scriptje.sh
^d
Die ctrl-d is om aan at aan te geven dat je klaar bent met het opvoeren van de commando's.

In jouw geval

1
2
3
at now
/home/musicbrainz/run_server.sh
^d


[ Bericht 0% gewijzigd door gebrokenglas op 10-05-2012 08:17:24 ]
Black_Ninjawoensdag 9 mei 2012 @ 21:28
quote:
0s.gif Op woensdag 9 mei 2012 10:00 schreef gebrokenglas het volgende:

[..]

Als je een script autonoom wilt draaien, kan dat op 2 manieren

methode 1: nohup

Zoiets:
[ code verwijderd ]

Ouput komt dan in een /tmp/run_server.sh.log file terecht, maar je scherm kun je rustig sluiten.

methode 2: at
at is een mechanisme a la cron, om dingen op een later tijdstip uit te voeren.
Bijvoorbeeld het starten van een scriptje om 12 uur 's middags:
[ code verwijderd ]

Die ctrl-d is om aan at aan te geven dat je klaar bent met het opvoeren van de commando's.

In jouw geval
[ code verwijderd ]

_O_ _O_ _O_ _O_ _O_ _O_

Je bent geweldig!!! HET WERKT!!! *O* *O* *O* *O* *O*

_O_ _O_ _O_ _O_ _O_ _O_
Dale.dinsdag 22 mei 2012 @ 20:31
scr0xaxis=$(xrandr --current | grep '*+' | uniq | awk '{print $1}' | cut -d 'x' -f1)
scr0yaxis=$(xrandr --current | grep '*+' | uniq | awk '{print $1}' | cut -d 'x' -f2)
scr1xaxis=$(xrandr --current | grep '* ' | uniq | awk '{print $1}' | cut -d 'x' -f1)
scr1yaxis=$(xrandr --current | grep '* ' | uniq | awk '{print $1}' | cut -d 'x' -f2)

$((element00=scr0xaxis/(scr0xaxis + scr1xaxis)))
$((element11=scr0yaxis/scr1yaxis))

echo -e $element00
echo -e $element11

Ik krijg steeds
0
0

terwijl het
0.5
0.78125

zou moeten zijn
(scr0xaxis = scr1xaxis = 1280, scr0yaxis = 800, scr1yaxis = 1024)
slacker_nldinsdag 22 mei 2012 @ 20:36
Post eens de output van xrandr --current

Never mind, zie het al

printf "%.2f\n" $ding :)

En anders moet je met bc werken:

echo "scale = 4 ; $x + $y" | bc

ben je er ook.
Dale.dinsdag 22 mei 2012 @ 21:07
Oke maar ik gebruik de variabele $element00 en $element11 eigenlijk niet om te echo-en ik wou het puur even printen om te debuggen... maar hoe kan ik het gebruiken in een commando?

Dit is het geheel...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function mapstylus()
{
    scr0xaxis=$(xrandr --current | grep '*+' | uniq | awk '{print $1}' | cut -d 'x' -f1)
    scr0yaxis=$(xrandr --current | grep '*+' | uniq | awk '{print $1}' | cut -d 'x' -f2)
    scr1xaxis=$(xrandr --current | grep '* ' | uniq | awk '{print $1}' | cut -d 'x' -f1)
    scr1yaxis=$(xrandr --current | grep '* ' | uniq | awk '{print $1}' | cut -d 'x' -f2)

    $((element00=scr0xaxis/(scr0xaxis + scr1xaxis)))
    $((element11=scr0yaxis/scr1yaxis))

    echo -e "scale = 5; $element00" | bc
    echo -e "scale = 5; $element11" | bc

    #xinput set-prop "Serial Wacom Tablet stylus" --type=float "Coordinate Transformation Matrix" $element00 0 0 0 $element11 0 0 0 1
}

wil het gebruiken om de xinput transformatie matrix aan te passen van mijn stylus.
slacker_nldinsdag 22 mei 2012 @ 21:24
nee, drop ff die output (heb hier geen linux bak dus enzo..)

btw, beetje optimalisatie:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function my_function() {
local output="$(xrandr --current)"

local w=$(echo -e "$output" | grep shizzle1)
local x=$(echo -e "$output" | grep shizzle2) 
local y=$(echo -e "$output" | grep shizzle3)
local z =$(echo -e "$output" | grep shizzle4)

local iets=$(echo "scale = 4; $x + $w | bc)
local anders=$(echo "scale 4; $y + $z" | bc )

xinput set-prop "Serial Wacom Tablet stylus" --type=float "Coordinate Transformation Matrix" $iets 0 0 0 $anders 0 0 0 1

}


[ Bericht 0% gewijzigd door slacker_nl op 22-05-2012 21:30:43 ]
relativitywoensdag 12 december 2012 @ 18:28
Is er hier nog leven? Ik kan wel wat hulp gebruiken hehe.
slacker_nlwoensdag 12 december 2012 @ 18:33
quote:
0s.gif Op woensdag 12 december 2012 18:28 schreef relativity het volgende:
Is er hier nog leven? Ik kan wel wat hulp gebruiken hehe.
Stel je vraag
µwoensdag 12 december 2012 @ 18:45
Hallo :W.
whoopswoensdag 12 december 2012 @ 20:56
    ​                  
Dale.donderdag 13 december 2012 @ 12:02
relativitydonderdag 13 december 2012 @ 18:55
Oke bedankt! :-)

Allereerst: Ik ben vrij basaal met het bash programmeren, maar vind het wel degelijk interessant!
Ik ben bezig geweest met een bash scriptje om mijn mp3 collectie wat op te schonen van vervelende tags e.d.

Echter moet ik mijn script meerdere malen uitvoeren om alles toe te passen op de bestanden.

Het script is als volgt:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#!/bin/bash

IFS=$'\n'           #changing IFS to newline means spaces
                    #are ignored during word-breaking

DIR=${1:-/home/mainstream/Music/rename}
TYPE='.mp3'
shopt -s extglob    #enable extended globbing

for file in $DIR/*$TYPE ; do

     filepath=${file%/*}
     newname=${file##*/}
     mp3=${file##*/}

     #remove junk characters from filename
     newname=${newname//+([,\'])/}

     regex='_\(final\)|\ \(CDQ\)|\ \(NoShout\)|\ \(CDQ \& Final\)|\ \(Dirty\)|\ \(Mastered\)|\ \(full\)'
     newname=${newname//+($regex)/}

     #replace delimiter
     regex='\ \-\ |\_\-\_|\-\-'
     newname=${newname//+($regex)/-}

     regex='_featuring_\|_feat_\|_f._\|_ft_|_feat._'
     newname=${newname//+($regex)/_ft._}

     regex='\(feat._|\(feat_'
     newname=${newname//+($regex)/\(ft._}

     #replace all instances
     newname=${newname//+(_and_)/_&_}

     #change spaces (and tabs) to underscores in filename
     #extglob reduces multiple spaces to single underscore
     newname=${newname//+([[:space:]])/_}

     #lowercase filename
     newname=${newname,,}

     #remove all initial "digit+[-_]" combinations
     #again extglob handles variable numbers of digits
     newname=${newname#+([0-9])[_-]}

     #remove any final group "-zzzz" strings
     #similar to the last operation
     #assumes the file ends in ".mp3", however
     regex='zzzz|mst|alki|you|wus|htf|whoa'
     newname=${newname/-+($regex).mp3/.mp3}

     #remove any "-(nnn_bpm)" strings
     #remember, spaces have been changed to underscores already
     newname=${newname/-(+([0-9])_bpm)}

     if [[ $mp3 != $newname ]]
     then
          echo \.-------------------------------------------------------------\.
          echo "Old: \"$mp3\""
          echo "New: \"$newname\""
          mv $DIR/$mp3 $DIR/$newname
          echo \'-------------------------------------------------------------\'
     fi

done
exit 0

Tweede stap:
Nu ben ik ook bezig om er iets dergelijks in te bouwen zoals dit:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash
DIR=${1:-/home/mainstream/Music/rename}

read -e -p "Enter Year: " -i "2012" YEAR
echo "Select a Genre"
select GENRE in "Classical" "Dubstep" "Hip-Hop" "Skip"; do
    case $GENRE in
        Classical ) echo $GENRE; break;;
        Dubstep ) echo $GENRE; break;;
        Hip-Hop ) echo $GENRE; break;;
        Rap ) echo $GENRE; break;;
        Skip ) exit;;

    esac
done

id3v2 -D $DIR/$DIR &> /dev/null
id3v2 -g $GENRE -y $YEAR $DIR/$DIR &> /dev/nul
En misschien automatisch ook de artist+song tags (ID3V1 & V2) toewijzen.

Hoe krijg ik dit in een script verwerkt? :P

Bij voorbaat dank O-)
slacker_nldonderdag 13 december 2012 @ 20:03
quote:
0s.gif Op donderdag 13 december 2012 18:55 schreef relativity het volgende:
Oke bedankt! :-)

Allereerst: Ik ben vrij basaal met het bash programmeren, maar vind het wel degelijk interessant!
Ik ben bezig geweest met een bash scriptje om mijn mp3 collectie wat op te schonen van vervelende tags e.d.

Echter moet ik mijn script meerdere malen uitvoeren om alles toe te passen op de bestanden.

Het script is als volgt:
[ code verwijderd ]

Tweede stap:
Nu ben ik ook bezig om er iets dergelijks in te bouwen zoals dit:
[ code verwijderd ]

En misschien automatisch ook de artist+song tags (ID3V1 & V2) toewijzen.

Hoe krijg ik dit in een script verwerkt? :P

Bij voorbaat dank O-)
Ik zou zelf met find werken, ik neem even aan dat je mp3's in subdirs hebt staan. Als ik dit script loslaat op m'n eigen music dir doet het namelijk helemaal niks.

1for file in $(find $DIR -name \*$TYPE); do

Verder kan je met basename en dirname werken (dat $filepath gedeelte)

Een andere tip is om dat hele rename gebeuren in een functie te frotten,

je kan dan met een subset dingen testen

1
2
3
for file in $(find $DIR -name \*$TYPE | head -10); do
   my_rename_func "$file"
done

Je zou daarna de mp3tags kunnen aanpassen in dezelfde loop, de nieuwe filename return je dan in je my_rename_func

1
2
3
4
5
6
7
8
9
function my_rename_func() {
    # while bunch of code
    echo $new_name
}

for file in $(find $DIR -name \*$TYPE | head -10); do
   new_file=$(my_rename_func "$file")
   tag_the_stuff $new_file
done

En de functie tag the stuff doe je al het spul wat je leuk om te mee te taggen.
relativitydonderdag 13 december 2012 @ 20:19
quote:
Ik zou zelf met find werken, ik neem even aan dat je mp3's in subdirs hebt staan. Als ik dit script loslaat op m'n eigen music dir doet het namelijk helemaal niks.
Nee alles staat gewoon in een dir; lekker makkelijk.

1
2
3
<?php
Verder kan je met basename en dirname werken 
(dat $filepath gedeelte)
?>
Oke :)

quote:
Een andere tip is om dat hele rename gebeuren in een functie te frotten,
Oke, nog nooit gedaan, maar ga ik eens proberen :D

quote:
je kan dan met een subset dingen testen
[ code verwijderd ]
Ga ik proberen :D

quote:
Je zou daarna de mp3tags kunnen aanpassen in dezelfde loop, de nieuwe filename return je dan in je my_rename_func
[ code verwijderd ]
Hier raak je mij een beetje kwijt haha!
Bedoel je tag_the_stuff als functie aanmaken en dan callen in die loop?

quote:
En de functie tag the stuff doe je al het spul wat je leuk om te mee te taggen.
Krijg hoofdpijn van die loops lol.

Maar goed. Bedankt voor de constructieve feedback. Kan ik morgen even verder gaan :D
relativitydonderdag 13 december 2012 @ 20:21
Het is een beetje lastig op Xubuntu...

In gedit zag je tenminste gekleerde tekst. Nou heb ik lap zwarte tekst.
Enige tips hiervoor? Want dit werkt niet echt fijn.

Zoiets bedoel je? (even snel geknipt/geplakt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#!/bin/bash
set -vx

IFS=$'\n'           #changing IFS to newline means spaces
                    #are ignored during word-breaking

DIR=${1:-/home/mainstream/Music/rename}
TYPE='.mp3'
shopt -s extglob    #enable extended globbing

function my_rename_func() {

     #break input filename into path and name
     #so that names with paths included are correctly handled
     filepath=${file%/*}
     newname=${file##*/}
     mp3=${file##*/}

     #remove junk characters from filename
     newname=${newname//+([,\'])/}

     regex='_\(final\)|\ \(CDQ\)|\ \(NoShout\)|\ \(CDQ \& Final\)|\ \(Dirty\)|\ \(Mastered\)|\ \(full\)'
     newname=${newname//+($regex)/}

     #replace delimiter
     regex='\ \-\ |\_\-\_|\-\-'
     newname=${newname//+($regex)/-}

     regex='_featuring_\|_feat_\|_f._\|_ft_|_feat._'
     newname=${newname//+($regex)/_ft._}

     regex='\(feat._|\(feat_'
     newname=${newname//+($regex)/\(ft._}

     #replace all instances
     newname=${newname//+(_and_)/_&_}

     #change spaces (and tabs) to underscores in filename
     #extglob reduces multiple spaces to single underscore
     newname=${newname//+([[:space:]])/_}

     #lowercase filename
     newname=${newname,,}

     #remove all initial "digit+[-_]" combinations
     #again extglob handles variable numbers of digits
     newname=${newname#+([0-9])[_-]}

     #remove any final "-zzzz" strings
     #similar to the last operation
     #assumes the file ends in ".mp3", however
     regex='zzzz|mst|alki|you|wus|htf|whoa'
     newname=${newname/-+($regex).mp3/.mp3}

     #remove any "-(nnn_bpm)" strings
     #remember, spaces have been changed to underscores already
     newname=${newname/-(+([0-9])_bpm)}

     #you can continue adding as many changes as you want here.

     #call mv to change the filename.
     #I used -iv to make it interactive and verbose, but that's up to you.
     if [[ $mp3 != $newname ]]
     then
          echo \.-------------------------------------------------------------\.
          echo "Old: \"$mp3\""
          echo "New: \"$newname\""
          #mv $DIR/$mp3 $DIR/$newname
          echo \'-------------------------------------------------------------\'
     fi
}

tag_the_stuff() {

read -e -p "Enter Year: " -i "2012" YEAR
echo "Select a Genre"
select GENRE in "Classical" "Dubstep" "Hip-Hop" "Skip"; do
    case $GENRE in
        Classical ) echo $GENRE; break;;
        Dubstep ) echo $GENRE; break;;
        Hip-Hop ) echo $GENRE; break;;
        Rap ) echo $GENRE; break;;
        Skip ) exit;;

    esac
done

id3v2 -D $DIR &> /dev/null
id3v2 -g $GENRE -y $YEAR $DIR &> /dev/nul
}

for file in $(find $DIR -name \*$TYPE | head -10); do
   new_file=$(my_rename_func "$file")
   tag_the_stuff $new_file
done

exit 0


[ Bericht 47% gewijzigd door relativity op 13-12-2012 20:36:18 ]
RemcoDelftdonderdag 13 december 2012 @ 20:49
quote:
0s.gif Op donderdag 13 december 2012 20:21 schreef relativity het volgende:
Het is een beetje lastig op Xubuntu...

In gedit zag je tenminste gekleerde tekst. Nou heb ik lap zwarte tekst.
Enige tips hiervoor? Want dit werkt niet echt fijn.
vi/vim/elvis o.i.d. gebruiken? 't Is even wennen, maar daarna wil je niets anders meer!
relativitydonderdag 13 december 2012 @ 20:51
quote:
0s.gif Op donderdag 13 december 2012 20:49 schreef RemcoDelft het volgende:

[..]

vi/vim/elvis o.i.d. gebruiken? 't Is even wennen, maar daarna wil je niets anders meer!
Dat is allemaal commandline hè? Hoewel ik daar een groot voorstander van ben, vind ik een GUI toch wat fijner werken met het schrijven van scripts :P

Ahh vim is grapical :D

[ Bericht 11% gewijzigd door relativity op 13-12-2012 21:10:20 ]
RemcoDelftdonderdag 13 december 2012 @ 21:11
Wat moet je met een GUI als je een script typt? Vi is ontworpen om snel mee te werken, leer het, en je bent sneller dan steeds je muis te pakken.

Klein voorbeeld, regel kopieren: yyp, dat kost iets van 0.3 seconden.
relativitydonderdag 13 december 2012 @ 21:15
quote:
0s.gif Op donderdag 13 december 2012 21:11 schreef RemcoDelft het volgende:
Wat moet je met een GUI als je een script typt? Vi is ontworpen om snel mee te werken, leer het, en je bent sneller dan steeds je muis te pakken.

Klein voorbeeld, regel kopieren: yyp, dat kost iets van 0.3 seconden.
Tjah het gaat met niet zozeer om snelheid. Ik doe dit enkel om er wat van te leren. GUI vind ik het makkelijkste, vandaar mijn keuze.
KomtTijd...dinsdag 8 januari 2013 @ 02:36
ok ik ben een beetje nieuw met shell scripting, en ik krijg een foutmelding die ik niet helemaal begrijp:
1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/sh
host_up=
while [ 1 ]; do
        new_host_up=`iw dev wlan0 station dump | grep -c **.**.**.**.**.**`
        if [ $new_hosts_up -ne $host_up ]; then
                echo $new_host_up
                host_up=$new_host_up
        else
                echo 'nothing to do'
        fi
        sleep 5
done
scriptje geeft de volgende output:
1
2
3
4
5
6
7
8
1
[5 seconden later]
sh: 1: unknown operand
nothing to do
[5 seconden later]
sh: 1: unknown operand
nothing to do
enz.

de 1e loop gaat dus goed, daarna niet meer.
Verslikt'ie zich in het feit dat ik new_host_up iedere keer probeer te overschrijven ofzo?

-edit- doel van het scriptje is natuurlijk dat'ie iedere 5 seconden checkt of mijn smartphone aanwezig is (ergo of ik thuis ben).
NightH4wkdinsdag 8 januari 2013 @ 04:21
Hmm, zet eens " om de vars in de if. Dus "$new_hosts_up" -ne "$host_up".
µdinsdag 8 januari 2013 @ 08:49
while true? of while sleep 5?
KomtTijd...dinsdag 8 januari 2013 @ 10:52
quote:
1s.gif Op dinsdag 8 januari 2013 08:49 schreef µ het volgende:
while true? of while sleep 5?
while True. Moet een startup scriptje worden op mijn router dat iedere 5 seconden kijkt of ik (mijn telefoon) thuis ben.
zal zodadelijk die aanhalingstekens proberen als ik weer een device met toetsenbord in mijn handen heb.
µdinsdag 8 januari 2013 @ 10:54
True inderdaad (post kwam van mobiel). Kijk ook even of je host_up= wil definieren als host_up=0. Wellicht helpt dat. :s).
KomtTijd...dinsdag 8 januari 2013 @ 14:45
Het waren de aanhalingstekens van NightH4wk :)
KomtTijd...dinsdag 8 januari 2013 @ 21:04
Pfft het waren toch niet die aanhalingstekens. Ik snap er helemaal niets meer van. Hoe fucking moeilijk kan het zijn om gewoon 2 variables tegen elkaar te vergelijken? Enkele haakjes, dubbele haakjes, ronde haakjes, wel/geen dollartekens, wel/geen aanhalingstekens... heb alles zitten proberen maar niets levert het gewenste resultaat.
Ciddinsdag 8 januari 2013 @ 21:23
Voor de brainiacs onder ons, iemand een verklaring voor het volgende verschijnsel?

1
2
3
4
5
6
7
8
9
10
[root@server1 ~]# ksh
# /bin/false;echo $?
1
# /bin/false;echo $?
1
# echo foo | grep $(echo foo | grep foo)
foo
# /bin/false;echo $?
0

Vooralsnog alleen voor elkaar gekregen op virtuele machines met RHEL/CentOS 5.8...
KomtTijd...dinsdag 8 januari 2013 @ 21:26
php op de router geinstalleerd en het is in 5 minuten gepiept :')
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/php-cli
<?php
$hostonline 
0;
while (
true) {
        
$new_hostonline exec("iw dev wlan0 station dump | grep -c **.**.**.**.**.**");
        if (
$hostonline != $new_hostonline) {
                echo 
$new_hostonline;
                
$hostonline $new_hostonline;
        }
        
sleep(5);
}
RemcoDelftdinsdag 8 januari 2013 @ 21:32
quote:
18s.gif Op dinsdag 8 januari 2013 21:04 schreef KomtTijd... het volgende:
Pfft het waren toch niet die aanhalingstekens. Ik snap er helemaal niets meer van. Hoe fucking moeilijk kan het zijn om gewoon 2 variables tegen elkaar te vergelijken? Enkele haakjes, dubbele haakjes, ronde haakjes, wel/geen dollartekens, wel/geen aanhalingstekens... heb alles zitten proberen maar niets levert het gewenste resultaat.
Ik gebruik uitsluitend bash, geen sh, dus ken de verschillen in details niet.
En ik kan hier niet zien wat "iw dev wlan0 station dump | grep -c **.**.**.**.**.**" voor output zou moeten geven: kan je dat hier dumpen?

In bash zou ik gewoon dit doen:
while test 1; do ping -c 5 192.168.a.b > /dev/null && echo 'Host is up'; done
Met 192.168.a.b het lokale IP wat je natuurlijk vast zet.
KomtTijd...dinsdag 8 januari 2013 @ 21:52
quote:
0s.gif Op dinsdag 8 januari 2013 21:32 schreef RemcoDelft het volgende:

[..]

Ik gebruik uitsluitend bash, geen sh, dus ken de verschillen in details niet.
En ik kan hier niet zien wat "iw dev wlan0 station dump | grep -c **.**.**.**.**.**" voor output zou moeten geven: kan je dat hier dumpen?

In bash zou ik gewoon dit doen:
while test 1; do ping -c 5 192.168.a.b > /dev/null && echo 'Host is up'; done
Met 192.168.a.b het lokale IP wat je natuurlijk vast zet.
Dat commando kijkt of de device (het mac-adres) in de verbonden stations voorkomt. Werkt prima, geeft 0 terug indien niet, en 1 of hoger indien wel. Ping werkt niet want als je telefoon in sleep gaat kun je 'm niet meer pingen. (bovendien wil je niet iedere 5 seconden een ping naar je telefoon sturen denk ik).

Ik wist niet dat er nog verschil zit tussen sh en bash, dus ook maar even Bash geinstalleerd en weer een paar verschillende combinaties geprobeerd, maar het maakt geen verschil. Ik hou het wel mooi op PHP.
SPOILER
gebruikt alleen maar 5x zo veel geheugen, verder niets :+
1
2
 5431  5243 root     S     7640  26%   0% /usr/bin/php-cli ./check.php 
 5610  5243 root     S     1844   6%   0% /bin/bash ./check_phone.sh 


[ Bericht 24% gewijzigd door KomtTijd... op 08-01-2013 21:59:08 ]
slacker_nldinsdag 8 januari 2013 @ 22:01
quote:
0s.gif Op dinsdag 8 januari 2013 21:23 schreef Cid het volgende:
Voor de brainiacs onder ons, iemand een verklaring voor het volgende verschijnsel?
[ code verwijderd ]

Vooralsnog alleen voor elkaar gekregen op virtuele machines met RHEL/CentOS 5.8...
Simpel toch.

echo foo | grep $(echo foo | grep foo)

dat is zoek foo in foo en dat laat ie zien en dan is de return code 0, bij false is de return code > 0, of 1 in dit geval.

En daarna een /bin/false.. apart, erg apart.


(zsh)$ echo foo | grep -q $(echo foo | grep foo)
22:02 pts/2 0 xxx
(zsh)$ /bin/false
22:02 pts/2 1 xxx

na pts/2 is de return code.
slacker_nldinsdag 8 januari 2013 @ 22:05
quote:
0s.gif Op dinsdag 8 januari 2013 21:32 schreef RemcoDelft het volgende:

[..]

Ik gebruik uitsluitend bash, geen sh, dus ken de verschillen in details niet.
En ik kan hier niet zien wat "iw dev wlan0 station dump | grep -c **.**.**.**.**.**" voor output zou moeten geven: kan je dat hier dumpen?

In bash zou ik gewoon dit doen:
while test 1; do ping -c 5 192.168.a.b > /dev/null && echo 'Host is up'; done
Met 192.168.a.b het lokale IP wat je natuurlijk vast zet.
sh is zo goed als dood, je hebt op Solaris nog sh, maar dat is grotendeels hele oude versies. Op Debian based bakken is het vaak dash.
µdinsdag 8 januari 2013 @ 23:08
quote:
0s.gif Op dinsdag 8 januari 2013 22:05 schreef slacker_nl het volgende:

[..]

sh is zo goed als dood, je hebt op Solaris nog sh, maar dat is grotendeels hele oude versies. Op Debian based bakken is het vaak dash.
dash?
NightH4wkdinsdag 8 januari 2013 @ 23:26
sh is niet zo goed als dood, het is gewoon een implementatie van IEEE POSIX 1003.2. Gewoon lekker basic en dat is goed, om systeem scripts uit te voeren, etc.
KomtTijd...woensdag 9 januari 2013 @ 01:04

duns.gif duns.gif
slacker_nlwoensdag 9 januari 2013 @ 06:41
quote:
14s.gif Op dinsdag 8 januari 2013 23:08 schreef µ het volgende:

[..]

dash?
1
2
3
4
5
6
Description: POSIX-compliant shell
 The Debian Almquist Shell (dash) is a POSIX-compliant shell derived from ash. 
 
 Since it executes scripts faster than bash, and has fewer library dependencies (making it more robust against software or
 hardware failures), it is used as the default system shell on Debian systems.
Homepage: http://gondor.apana.org.au/~herbert/dash/
slacker_nlwoensdag 9 januari 2013 @ 07:07
quote:
0s.gif Op dinsdag 8 januari 2013 23:26 schreef NightH4wk het volgende:
sh is niet zo goed als dood, het is gewoon een implementatie van IEEE POSIX 1003.2. Gewoon lekker basic en dat is goed, om systeem scripts uit te voeren, etc.
Welke systemen draaien nog de native bourne shell? Dat zijn er vrij weinig volgens mij.
Cidwoensdag 9 januari 2013 @ 08:54
quote:
0s.gif Op dinsdag 8 januari 2013 22:01 schreef slacker_nl het volgende:

[..]

Simpel toch.

echo foo | grep $(echo foo | grep foo)

dat is zoek foo in foo en dat laat ie zien en dan is de return code 0, bij false is de return code > 0, of 1 in dit geval.

En daarna een /bin/false.. apart, erg apart.


(zsh)$ echo foo | grep -q $(echo foo | grep foo)
22:02 pts/2 0 xxx
(zsh)$ /bin/false
22:02 pts/2 1 xxx

na pts/2 is de return code.

De nested pipe in de command substitution veroorzaakt dat de returncodes niet meer kloppen. Bugreportje aangemaakt..
NightH4wkwoensdag 9 januari 2013 @ 14:03
quote:
0s.gif Op woensdag 9 januari 2013 07:07 schreef slacker_nl het volgende:

[..]

Welke systemen draaien nog de native bourne shell? Dat zijn er vrij weinig volgens mij.
De BSDs en Android?
Dale.zaterdag 23 februari 2013 @ 17:22
Vraagje... heeft iemand hier een script die t volgende kan?

Ik heb een folder. Hierin zitten allemaal plaatjes. Nu heb ik een boel dubbele files omdat zij van naam verschillenen. Nu is het veel te veel werk om dit allemaal na te gaan. Daarom zoek een script dat eigenlijk dus checkt welke plaatjes dus allemaal dubbel zijn en dubbele plaatjes verwijderd.
NightH4wkzaterdag 23 februari 2013 @ 17:29
Maak een hash van elke picca en delete de dubbelen? Zijn scripts voor te vinden.
Dale.zaterdag 23 februari 2013 @ 17:34
Ja heb net deze gevonden die alles checkt;

1find -not -empty -type f -printf "%s\n" | sort -rn | uniq -d | xargs -I{} -n1 find -type f -size {}c -print0 | xargs -0 md5sum | sort | uniq -w32 --all-repeated=separate

En deze die alle dubbele delete
1find -not -empty -type f -printf "%s\n" | sort -rn | uniq -d |  xargs -I{} -n1 find -type f -size {}c -print0 | xargs -0 md5sum | sort | uniq -w32 --all-repeated=separate | cut -f3-100 -d ' ' | tr '\n.' '\t.' | sed 's/\t\t/\n/g' | cut -f2-100 | tr '\t' '\n' | perl -i -pe 's/([ (){}-])/\\$1/g' | perl -i -pe 's/'\''/\\'\''/g' | xargs -pr rm -v

Nu even kijken hoe ik deze recursief kan maken :P
relativityzaterdag 23 februari 2013 @ 17:39
quote:
7s.gif Op zaterdag 23 februari 2013 17:34 schreef Dale. het volgende:
Ja heb net deze gevonden die alles checkt;
[ code verwijderd ]

En deze die alle dubbele delete
[ code verwijderd ]

Nu even kijken hoe ik deze recursief kan maken :P
Volgens mij doet je find command dat al automatisch als ik het goed heb.
µzaterdag 23 februari 2013 @ 19:29
quote:
7s.gif Op zaterdag 23 februari 2013 17:22 schreef Dale. het volgende:
Vraagje... heeft iemand hier een script die t volgende kan?

Ik heb een folder. Hierin zitten allemaal plaatjes. Nu heb ik een boel dubbele files omdat zij van naam verschillenen. Nu is het veel te veel werk om dit allemaal na te gaan. Daarom zoek een script dat eigenlijk dus checkt welke plaatjes dus allemaal dubbel zijn en dubbele plaatjes verwijderd.
fdupes ;).
µzaterdag 23 februari 2013 @ 19:30
$ fdupes --recursive --noempty /pad/naar/directory

geeft bloedjesnel alle overeenkomende bestanden. Hij zoekt eerst recursief alles, vergelijkt daarna op grootte en daarna op hash.
RemcoDelftzaterdag 23 februari 2013 @ 23:07
fdupes is inderdaad fantastisch spul! Voor ik dat vond had ik zelf zoiets in elkaar gescript... fdupes is veel beter.
µzaterdag 23 februari 2013 @ 23:37
quote:
0s.gif Op zaterdag 23 februari 2013 23:07 schreef RemcoDelft het volgende:
fdupes is inderdaad fantastisch spul! Voor ik dat vond had ik zelf zoiets in elkaar gescript... fdupes is veel beter.
heb er inderdaad een mooi script voor weggegooid :P
relativityvrijdag 1 maart 2013 @ 22:19
Even nog een vraag voor de script guru's:

Ik heb een script die de applicatie status gecontroleerd. Hij controleert op de applicaties al gestart zijn en als dat niet geval is, doet dit script dat voor mij.

Echter ontstaat het probleem dat hij de applicaties na elkaar controleert (PGREP) en gaat dus alleen verder als de exit status van de vorige applicatie nul is, ergo hij start de rest van de applicaties niet op. Dit heb ik deels weten te omzeilen om programma's als daemon te starten, maar de opeenvolgende programma's hebben die mogelijkheid niet (sickbeard & autosub).

1
2
3
4
5
6
7
8
9
10
11
 if [ $APPLICATIONSTATUS -ne 0 ]; then
  case $APPLICATION in
   sabnzbd) 
            /usr/bin/sabnzbdplus -d
            ;;
   SickBeard*)
            /usr/bin/python /home/mainstream/SickBeard/SickBeard.py
            ;;
   AutoSub*)
            /usr/bin/python /home/mainstream/SickBeard/auto-sub/AutoSub.py
            ;;

Heeft het zin om de output te verwijzen naar /dev/null 2>&1 om dit probleem te omzeilen of hoe kan ik dit het best aanpakken.

BVD :)
µvrijdag 1 maart 2013 @ 22:22
quote:
0s.gif Op vrijdag 1 maart 2013 22:19 schreef relativity het volgende:
Even nog een vraag voor de script guru's:

Ik heb een script die de applicatie status gecontroleerd. Hij controleert op de applicaties al gestart zijn en als dat niet geval is, doet dit script dat voor mij.

Echter ontstaat het probleem dat hij de applicaties na elkaar controleert (PGREP) en gaat dus alleen verder als de exit status van de vorige applicatie nul is, ergo hij start de rest van de applicaties niet op. Dit heb ik deels weten te omzeilen om programma's als daemon te starten, maar de opeenvolgende programma's hebben die mogelijkheid niet (sickbeard & autosub).
[ code verwijderd ]

Heeft het zin om de output te verwijzen naar /dev/null 2>&1 om dit probleem te omzeilen of hoe kan ik dit het best aanpakken.

BVD :)
Ik doe het zo:
1
2
3
4
pgrep fbpanel || fbpanel&
pgrep RetroShare || RetroShare&
pgrep redshift || redshift -l 52.130:4.659&
pgrep opera || /usr/bin/opera&
Voor elke regel geldt: als het programma niet draait wordt het opgestart :s).
relativityzondag 3 maart 2013 @ 21:23
quote:
14s.gif Op vrijdag 1 maart 2013 22:22 schreef µ het volgende:

[..]

Ik doe het zo:
[ code verwijderd ]

Voor elke regel geldt: als het programma niet draait wordt het opgestart :s).
Ja dat weet ik dat dat zo kan, alleen weet ik niet hoe ik dit in mijn script moet verwerken, omdat het afzonderlijke commands zijn.
Dale.donderdag 21 maart 2013 @ 20:48
Weet iemand of het volgende kan in VIM? En zo ja hoe?

Bij het copy/paste/delete in VISUAL mode kan ik iets kopieren en dan maar één keer pasten. Ik wil iets kopieren en dan ongelimiteerd pasten zonder dat ik dus die copy actie weer opnieuw moet doen. Hoe doe ik dat?
slacker_nldonderdag 21 maart 2013 @ 21:06
quote:
7s.gif Op donderdag 21 maart 2013 20:48 schreef Dale. het volgende:
Weet iemand of het volgende kan in VIM? En zo ja hoe?

Bij het copy/paste/delete in VISUAL mode kan ik iets kopieren en dan maar één keer pasten. Ik wil iets kopieren en dan ongelimiteerd pasten zonder dat ik dus die copy actie weer opnieuw moet doen. Hoe doe ik dat?
Je kan het in een paste buffer stoppen, even vergeten hoe ookalweer.

Select block, shift " [a-z] y (om te yanken).
dan

shift " [a-z] p (om te pasten).

en a-z zijn dan je buffers, dus je kan een buffer in a hebben, in b en die zijn verschillend.

En dat werkt ook tussen files in dezelfde vim sessie.
Dale.donderdag 21 maart 2013 @ 21:07
quote:
0s.gif Op donderdag 21 maart 2013 21:06 schreef slacker_nl het volgende:

[..]

Je kan het in een paste buffer stoppen, even vergeten hoe ookalweer.

Select block, shift " [a-z] y (om te yanken).
dan

shift " [a-z] p (om te pasten).

en a-z zijn dan je buffers, dus je kan een buffer in a hebben, in b en die zijn verschillend.

En dat werkt ook tussen files in dezelfde vim sessie.
Super! Ga even proberen dan :)
slacker_nldonderdag 21 maart 2013 @ 21:12
quote:
7s.gif Op donderdag 21 maart 2013 21:07 schreef Dale. het volgende:

[..]

Super! Ga even proberen dan :)
Moet lukken, ik heb het net getest :P
Dale.donderdag 21 maart 2013 @ 21:15
quote:
0s.gif Op donderdag 21 maart 2013 21:12 schreef slacker_nl het volgende:

[..]

Moet lukken, ik heb het net getest :P
KomtTijd...donderdag 11 juli 2013 @ 14:14
1
2
3
4
5
6
running=$(mysql -u ******** -p******** -e SHOW SLAVE STATUS\G" | /bin/grep "Slave_SQL_Running: ")
if [${running} == "Slave_SQL_Running: Yes"]; then
    /usr/bin/zenity --warning --text="Replication is running\n${running}" --display=:0.0
else
    /usr/bin/zenity --warning --text="Replication is NOT running\n${running}" --display=:0.0
fi
ik krijg constant de melding:
line 2 [: missing `]'
...en hij gaat naar het else statement, terwijl echo ${running} wel degelijk "Slave_SQL_Running: Yes" laat zien...

Weet iemand wat ik fout doe?

-edit-
fixed
== moest zijn =
en hij struikelde over whitespaces.

[ Bericht 3% gewijzigd door KomtTijd... op 11-07-2013 14:37:58 ]
slacker_nldonderdag 11 juli 2013 @ 18:39
quote:
14s.gif Op donderdag 11 juli 2013 14:14 schreef KomtTijd... het volgende:

[ code verwijderd ]

ik krijg constant de melding:
line 2 [: missing `]'
...en hij gaat naar het else statement, terwijl echo ${running} wel degelijk "Slave_SQL_Running: Yes" laat zien...

Weet iemand wat ik fout doe?

-edit-
fixed
== moest zijn =
en hij struikelde over whitespaces.
Waarom zou je dat doen?

als je echo bla | grep -q bla doet dan weet je de return value van grep en dan kan je met een simpele stukje code eea fixen:

1
2
3
4
5
6
echo bla | grep -q bla 
if [ $? -eq 0 ] ; then
   echo "bla found"
else
   echo "bla was not found"
fi
KomtTijd...donderdag 11 juli 2013 @ 19:09
omdat 3 woorden: quick and dirty.

maar die tip ga ik er morgen toch wel even in verwerken denk ik