1 2 3 4 5 | # Of env | grep SHELL # en ter overbodigheid grep username /etc/passwd | awk -F\/ '{print $NF}' |
1 2 3 4 | $ bash $ echo $SHELL /bin/zsh |
1 |
1 2 3 4 5 6 7 | CHARS=(t v p) for C in ${CHARS[@]} do echo -n $C done echo '' |
apt-get install humor?quote:Op maandag 14 januari 2008 12:11 schreef Daniel1976 het volgende:
Daarbij zijn dat commando's die zo ontzettend zielig zijn om te roepen in dit soort topics.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:quote:Op maandag 14 januari 2008 12:14 schreef Slarioux het volgende:
Dat kan je je postrechten kosten Daniel. Zeg maar voor altijd.
mietje slarquote:Op maandag 14 januari 2008 12:54 schreef slacker_nl het volgende:
nee, dit kost je postrechten:
Wat doet 't ofzo? Ik ken niks van code dus zou wel graag weten wat 't is voor ik 't eens uitprobeerquote:
Deze code print de letters TVP op je console.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
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 :)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.
1 2 3 4 5 6 7 8 | 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$ |
De makkelijkste manier om dit te doen is overigens zo:quote:
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 | # 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 |
1 2 3 4 | SIZE_H=20 SIZE_W=50 SIZE_L=3 |
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 | # 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 |
1 |
1 2 3 4 5 6 7 8 9 10 | 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 |
Je haalt nu twee dingen door elkaar;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 ]
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 | 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 |
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.)quote:Op donderdag 19 juni 2008 01:41 schreef slacker_nl het volgende:
Gebruik van arrays
[ code verwijderd ]
Nu weet ik dat whoops 99,9% bash code schrijft, en ik weet ook dat ie in 99,99% geen sh compatible code nodig heeftquote: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.)
quote:Op dinsdag 24 juni 2008 19:24 schreef slacker_nl het volgende:
i=$((i + 1))
Dit waren degene die ik zocht, thanks slack...quote:$HOME gebruiken
Je moet dan ‘eval’ gebruiken. eval is een built-in commando dat de argumenten evalueert als waren ze een string in een shell-script.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?
1 2 3 | bar=baz eval echo \$$foo |
1 |
1 2 3 4 5 6 7 | foo1="foo one" foo2="foo two" foo3="foo three" for i in 0 1 2 3; do eval echo \$foo$i; done; |
Het gebruiken van eval doet slacker ook al in zijn antwoord op mijn vraag hierboven...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.
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 handigerquote: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.
1 2 3 4 5 6 7 8 9 10 | if [ -n "$1" ] ; then CHOICES="$CHOICES $1" LIMIT=$((LIMIT + 1)) #LIMIT=`expr $LIMIT + 1` else CHOICES="" LIMIT=0 fi } |
Goeie zaak, want ik had dit topic nog niet eerder opgemerkt!quote:Op donderdag 28 augustus 2008 11:37 schreef Jo0Lz het volgende:
Centraal.
Het kan ook erger (spreek ik uit ervaring... 8)7 8)7 ):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!
1 |
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.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
1 2 3 4 5 6 7 | regex="};" if [[ "$string" =~ $regex ]]; then echo "Jay, ik heb ${#BASH_REMATCH[*]} keer een }; gevonden"; else echo "He verdorie, niets.."; fi |
1 2 3 | nr=`echo "$string" | tr "{" "\n" | wc -l` let nr=nr-1; |
1 2 3 4 5 | $ echo "$string" | tr "}" "\n" | wc -l 8 $ echo "$string" | tr "{" "\n" | wc -l 8 |
Klopt, echter is de sluit "tag" }; dus inclusief de ;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.
1 2 3 4 5 6 7 8 9 | 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; |
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 | 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." } |
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: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 ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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; } ; }; |
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.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.
1 2 3 | echo $bla . ./CS01.WANA-EAS.FI.2008.048.v02.csv ./CS01.BBDD-DSL.FI.2008.018.v02.csv ./rrd.ppt |
1 2 3 4 5 6 | echo $bla . ./CS01.WANA-EAS.FI.2008.048.v02.csv ./CS01.BBDD-DSL.FI.2008.018.v02.csv ./rrd.ppt |
Kan ook zonder de -print. Gebruik ze beide. Maar ik hoef niet over find te loopen.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
En als niet perse sh compatible code hoeft te schrijven $() is veel sneller dan backticks.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
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 | 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" |
1 |
1 2 3 | pid=$(echo $i | cut -d\$ -f1) name=$(echo $i | cut -d\$ -f2) |
Gebruik dan ook geen bash maar zsh ofzo...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??
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.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?
1 |
1 2 3 4 5 6 7 8 9 | # 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=#' |
1 2 3 | # of mooier en meer lijkend op het perl ding: sed -e 's#BOOT_IMAGE=[^[:space:]]\+ ##' |
1 2 3 | commando $i $i.out done; |
1 2 3 | touch "$i" done; |
1 2 3 | convert "$i" -resize 20% th_"$i".jpg done; |
1 2 3 | echo convert "$i" -resize 20% th_"$i".jpg done; |
1 |
Oh ja. Foutje. Foutje van FOK! zelfs, er staat wel *; in de source, maar dat verdwijnt in een code omgeving.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.
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).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!
1 2 3 4 5 6 7 8 9 10 | int main(void) { ... while(!done) { print_rooster(); sleep(1); //1 seconde //of b.v.: usleep(500000); // 500000 microseconden } |
Zelfs als je een getal terugkrijgt: wat wil je dat je ftp-client daarmee doet?quote: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)?
Bestanden hernoemen, ssh toegang heb ik geloof ik wel (weet alleen niet hoe ik dat opzet, even uitzoeken)quote: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.
1 | rename -n 's/(Bestand)(\d+)/$1Wii$2/' Bestand*.jpg |
Tyquote: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
Google even op lftp (mirror)quote: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..?
Tyquote:
1 | rename -n 's/(Bestand)(\d+)/$1Wii$2/' Bestand*.jpg |
Het is gewoon een perl regexp ja, die -n is dat ie laat zien wat ie zou doen, zonder het daadwerkelijk te doen.quote:Op zondag 19 december 2010 14:56 schreef Dale. het volgende:
[..]
Tyvraagje 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?
Mijn persoonlijke voorkeur is tegenwoordig scp (ssh-toegang vereist):quote: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..?
Hmmm die -n flag doet het volgens mij niet bij mequote: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.
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 |
ok en hoe krijg ik dat? Vind alleen maar lange manualsquote:Op zondag 19 december 2010 17:40 schreef slacker_nl het volgende:
dat werkt niet met ftp nee, ssh toegang is wel een vereiste
Als je server ssh draait, dan vanuit windows met putty of vanuit linux gewoon vanuit de terminal:quote:Op zondag 19 december 2010 18:58 schreef Dale. het volgende:
[..]
ok en hoe krijg ik dat? Vind alleen maar lange manualswaar ik niet veel zin heb om die helemaal door te lezen.
Ah thanks dat is eenvoudig.quote: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
Vraagje... hoe verplaats ikquote: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.
mkdir "Home Alone" ; mv "Home Alone.mkv.part01.rar" "Home Alone/Home Alone.mkv.part01.rar"quote: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.
ah ja sorry maar bedoel natuurlijk alle parts iets van 50 ofzoquote: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.
mv Home\ Alone.mkv.part*.rar Home\ Alone/quote:Op maandag 27 december 2010 23:22 schreef Dale. het volgende:
[..]
ah ja sorry maar bedoel natuurlijk alle parts iets van 50 ofzodus dat hij alle .rar's verplaatst, niet enkel 01.
Hmmmm ik heb nu via ssh admin@<ip> ssh geopend alleen wanneer ik de commando rename uitvoer zegt die dat hij die niet kent...quote:Op zondag 19 december 2010 17:40 schreef slacker_nl het volgende:
dat werkt niet met ftp nee, ssh toegang is wel een vereiste
Rename commando bestaat ook niet voor Linux. Normaliter doe je het met het 'mv' commando (move)quote: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...
pssstquote: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/
dan doe je echo "mv stuff daar" en dan zie je wat je zou doenquote: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?
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:quote:Op donderdag 29 september 2011 22:19 schreef PiRANiA het volgende:
Hebben mensen nog interessante scriptjes?.
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 |
1 | VBoxManage startvm "vm" --type headless |
1 | ~/run_replication.sh |
1 | ./run_server.sh |
1 | sudo shutdown now |
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.quote: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.
1 | 0 0 * * * /usr/bin/aptitude update &>/dev/null |
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 |
Sorry ik probeer zo snel mogelijk alles onder de knie te krijgen maar ik ben nogsteeds een groentje hiermeequote: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
1 | /usr/lib/virtualbox/VBoxManage startvm "vm" --type headless |
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 |
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.quote: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
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 |
Ja dat begrijp ik dus ook niet waar hij het niet doetquote: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 ]
Kan aan path en environment vars liggen.quote: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!
quote:Op dinsdag 8 mei 2012 18:58 schreef PiRANiA het volgende:
[..]
Kan aan path en environment vars liggen.
Post je script eensquote:Op dinsdag 8 mei 2012 19:25 schreef Black_Ninja het volgende:
[..]zou je dat een beetje kunnen toelichten?
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 |
Dat doe ik toch goed?quote: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.
quote: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} |
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 doequote: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 nietquote: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?
1 | ~/run_replication.sh |
1 | ./run_server.sh |
log blijft leeg maar wordt wel aangemaaktquote: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
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 werkt dus, en die moest met ~/ worden gestartquote: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 draadJep: you@shellscripts$ enter() { echo "Shell scripting ftw!, deel 1
Die werken dus ook niet!quote:Op dinsdag 8 mei 2012 23:23 schreef slacker_nl het volgende:
DUDE STOP FUCKING WITH RELATIVES PATHS!!!!! ABSOLUTE PATHS PLEASE!!!!!!
1 | /home/musicbrainz/run_server.sh |
Als ik meer info had zou ik het graag gevenquote: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
run_replication.sh staat in dezelfde map als run_server.sh dat is dus allemaal zo vreemdquote: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.
Maar wordt het script dus aangeroepen? Indien dat het geval is dat zit het probleem in de .sh.quote:run_replication.sh staat in dezelfde map als run_server.sh dat is dus allemaal zo vreemd
net het even omgedraaid en ook dan wordt replication wel aangeroepen en server niet.quote: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.
Als je een script autonoom wilt draaien, kan dat op 2 manierenquote: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?
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 |
1 2 3 | at 12pm /home/bla/scriptje.sh ^d |
1 2 3 | at now /home/musicbrainz/run_server.sh ^d |
quote: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 ]
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 } |
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 } |
Stel je vraagquote:Op woensdag 12 december 2012 18:28 schreef relativity het volgende:
Is er hier nog leven? Ik kan wel wat hulp gebruiken hehe.
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 |
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 |
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.quote: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?
Bij voorbaat dank
1 | for file in $(find $DIR -name \*$TYPE); do |
1 2 3 | for file in $(find $DIR -name \*$TYPE | head -10); do my_rename_func "$file" done |
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 |
Nee alles staat gewoon in een dir; lekker makkelijk.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.
1 2 3 | <?php Verder kan je met basename en dirname werken (dat $filepath gedeelte) ?> |
Oke, nog nooit gedaan, maar ga ik eens proberenquote:Een andere tip is om dat hele rename gebeuren in een functie te frotten,
Ga ik proberenquote:je kan dan met een subset dingen testen
[ code verwijderd ]
Hier raak je mij een beetje kwijt haha!quote:Je zou daarna de mp3tags kunnen aanpassen in dezelfde loop, de nieuwe filename return je dan in je my_rename_func
[ code verwijderd ]
Krijg hoofdpijn van die loops lol.quote:En de functie tag the stuff doe je al het spul wat je leuk om te mee te taggen.
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 |
vi/vim/elvis o.i.d. gebruiken? 't Is even wennen, maar daarna wil je niets anders meer!quote: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.
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 scriptsquote: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!
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.quote: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.
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 |
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. |
while True. Moet een startup scriptje worden op mijn router dat iedere 5 seconden kijkt of ik (mijn telefoon) thuis ben.quote:
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 # |
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); } |
Ik gebruik uitsluitend bash, geen sh, dus ken de verschillen in details niet.quote: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.
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).quote: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.
SPOILEROm spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.
[ Bericht 24% gewijzigd door KomtTijd... op 08-01-2013 21:59:08 ]
Simpel toch.quote: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...
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.quote: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.
dash?quote: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.
quote:
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/ |
Welke systemen draaien nog de native bourne shell? Dat zijn er vrij weinig volgens mij.quote: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.
De nested pipe in de command substitution veroorzaakt dat de returncodes niet meer kloppen. Bugreportje aangemaakt..quote: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 BSDs en Android?quote: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.
1 | find -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 |
1 | find -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 |
Volgens mij doet je find command dat al automatisch als ik het goed heb.quote: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
fdupesquote: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.
heb er inderdaad een mooi script voor weggegooidquote: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.
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 ;; |
Ik doe het zo:quote: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
1 2 3 4 | pgrep fbpanel || fbpanel& pgrep RetroShare || RetroShare& pgrep redshift || redshift -l 52.130:4.659& pgrep opera || /usr/bin/opera& |
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.quote: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.
Je kan het in een paste buffer stoppen, even vergeten hoe ookalweer.quote: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?
Super! Ga even proberen danquote: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.
Moet lukken, ik heb het net getestquote:
quote:Op donderdag 21 maart 2013 21:12 schreef slacker_nl het volgende:
[..]
Moet lukken, ik heb het net getest
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 |
Waarom zou je dat doen?quote: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.
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 |
|
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |