Sida 1 av 1
Skapa en .sh-fil som utför några kommandon
Postat: 12 aug 2011, 14:31
av Trubbelgum
Hej! Jag har lite problem med att skapa en .sh-fil som utför följande kommandon:
Kod: Markera allt
sudo apt-get install scanmem
sudo scanmem -p $(pidof plugin-container)
1154221576722516516
set 1154221576722319908
reset
-8778627313621546964
set -8778627313621683412
reset
-3734597221320194516
set -3734597221320325076
reset
-5247808792060906708
set -5247808792060852180
reset
-4094887278864124628
set -4094887278864318932
reset
-6688959624847440084
set -6688959624847260116
reset
290344280678655
set 290344117872383
reset
Finnished!
exit
Om jag kopierar ovanstående kommandon och klistrar in de i terminalen fungerar de precis som de ska. Om jag istället lägger kommandona i en körbar .sh-fil och sedan väljer "run in terminal" när jag startar den, så utför den bara dessa kommandon:
Kod: Markera allt
sudo apt-get install scanmem
sudo scanmem -p $(pidof plugin-container)
När väl "scanmem" har startat så slutar den alltså att genomföra kommandona.
Varför fungerar det om man klistrar in allt i terminalen direkt, men inte när man kör precis samma text i en .sh-fil?
Tack på förhand!
Re: Skapa en .sh-fil som utför några kommandon
Postat: 12 aug 2011, 15:37
av ubot
shebang! Läs under "2.2.1. Which shell will run the script?":
http://www.tldp.org/LDP/Bash-Beginners- ... 02_02.html
Re: Skapa en .sh-fil som utför några kommandon
Postat: 12 aug 2011, 16:06
av m!rage
Du vill alltså köra
Kod: Markera allt
sudo apt-get install scanmem
sudo scanmem -p $(pidof plugin-container)
och sedan använda returvärdet (ex. 1154221576722516516) som argument till nästa kommando (set)? Då måste du ta hand om det på något sätt, exempelvis genom att spara det i en variabel som du använder så här:
Kod: Markera allt
VARIABEL1=$(sudo scanmem -p $(pidof plugin-container))
set $VARIABEL1
VARABEL2=$(reset)
set $VARIABEL2
Du kan återanvända samma variabelnamn om dess innehåll inte är intressant efter att det använts i kommandot efter. I så fall kan du lika gärna utmatningen direkt utan att mellanlagra det:
Kod: Markera allt
set $(sudo scanmem -p $(pidof plugin-container))
set $(reset)
Eftersom du kör set och reset sju gånger på raken kan du göra detta i en slinga:
Kod: Markera allt
for((raknare=0;raknare<7;raknare++)); do set $(reset); done
Det gör att hela skriptet kan förenklas till:
Kod: Markera allt
sudo apt-get install scanmem
set $(sudo scanmem -p $(pidof plugin-container))
for((raknare=0;raknare<7;raknare++)); do set $(reset); done
echo 'Finished!'
Lite häftigare, men lite svårare att läsa också
@ubot: #!/bin/bash är inte strikt nödvändigt eftersom alla Ubuntuinstallationer ändå använder Bash som standard. Men det är förstås bra att vara övertydlig, särskilt om det är en dator man pratar med

Re: Skapa en .sh-fil som utför några kommandon
Postat: 12 aug 2011, 22:58
av ubot
Mm, misstänkte att !#/bin/bash inte var nödvändigt faktiskt. Jag tyckte det var så konsigt att koden fungerade för trådskaparen i Terminalen med inte i ett skript och såg inget annat fel.
Postat: 13 aug 2011, 22:34
av Trubbelgum
Har lärt mig att skriptet måste få reda på vilken källa/program den ska köra ifrån, så jag löste det så här nu:
Kod: Markera allt
sudo apt-get install scanmem
sudo scanmem -p $(pidof plugin-container) << START/STOP
1154221576722516516
set 1154221576722319908
reset
-8778627313621546964
set -8778627313621683412
reset
-3734597221320194516
set -3734597221320325076
reset
-5247808792060906708
set -5247808792060852180
reset
-4094887278864124628
set -4094887278864318932
reset
-6688959624847440084
set -6688959624847260116
reset
290344280678655
set 290344117872383
reset
exit
START/STOP
Finnished!
Dock har jag stött på ett nytt problem. Jag vill att det ska vara en paus på omkring 5 sekunder mellan två kommando.
Kod: Markera allt
firefox file:///home/a/Documents/XXX.htm
[b]-- Här vill jag ha en 5 sekunders paus --[/b]
cat ~/Documents/PR2/Script/X.macro| xmacroplay -d 100 :1
sudo scanmem -p $(pidof plugin-container) << START/STOP
...
START/STOP
Finnished!
Någon som vet hur man kan göra?
Re: Skapa en .sh-fil som utför några kommandon
Postat: 13 aug 2011, 23:37
av m!rage
Jag fattar inte riktigt resten av ditt skript men pausen fixar du med
Re: Skapa en .sh-fil som utför några kommandon
Postat: 14 aug 2011, 10:45
av Trubbelgum
Tack för "sleep 5" m!rage!
Nu återstår ett problem. När jag öppnar firefox via terminalen, går det inte att ge kommandon förrän firefox har stängts ned.
Kod: Markera allt
sudo apt-get install scanmem
sudo apt-get install xmacro
echo file:///home/a/XXX.htm | firefox [b]Efter detta kommer skriptet inte vidare[/b]
sleep 5
echo MotionNotify 400 400 ButtonPress 1 ButtonRelease 1 | xmacroplay -d 100 :0
sudo scanmem -p $(pidof plugin-container) << START/STOP
...
START/STOP
Finnished!
Finns det något sätt att öppna firefox via terminalen, utan att det stoppar hela skriptet?
Re: Skapa en .sh-fil som utför några kommandon
Postat: 14 aug 2011, 12:16
av Adoby
Det går bra. Skriv ett ampersand efter firefox:
firefox &
Prova gärna att söka på internet innan du frågar. Detta svar, och det tidigare, är mycket enkelt tillgängliga via exempelvis google.
Postat: 15 aug 2011, 15:03
av Trubbelgum
Tack för all hjälp! Mitt skript är färdigt nu.
Kod: Markera allt
#!/bin/bash
sudo apt-get install scanmem
sudo apt-get install xmacro
kstart firefox http://www.xxq.site40.net/pr2/ &
echo Delay 10 MotionNotify 400 400 ButtonPress 1 ButtonRelease 1 MotionNotify 400 400 ButtonPress 1 ButtonRelease 1 | xmacroplay -d 100 :1 &
echo Delay 10 MotionNotify 400 400 ButtonPress 1 ButtonRelease 1 MotionNotify 400 400 ButtonPress 1 ButtonRelease 1 | xmacroplay -d 100 :0
sudo scanmem -p $(pidof plugin-container) << START/STOP
1154221576722516516
set 1154221576722319908
reset
-8778627313621546964
set -8778627313621683412
reset
-3734597221320194516
set -3734597221320325076
reset
-5247808792060906708
set -5247808792060852180
reset
-4094887278864124628
set -4094887278864318932
reset
-6688959624847440084
set -6688959624847260116
reset
290344280678655
set 290344117872383
reset
exit
START/STOP
echo MotionNotify 520 540 ButtonPress 1 ButtonRelease 1 | xmacroplay :0
Finnished!
Re: Skapa en .sh-fil som utför några kommandon
Postat: 15 aug 2011, 18:07
av m!rage
Aha, du tänker fuska i ett spel?

Re: Skapa en .sh-fil som utför några kommandon
Postat: 27 feb 2012, 22:46
av Johnny Rosenberg
m!rage skrev:#!/bin/bash är inte strikt nödvändigt eftersom alla Ubuntuinstallationer ändå använder Bash som standard. Men det är förstås bra att vara övertydlig, särskilt om det är en dator man pratar med

Kanske stämmer för vissa versioner, men sh verkar i de flesta fall vara länkat till dash, inte bash.
Har själv haft problem (i Ubuntu 10.10) när jag skrivit ”#!/bin/sh” och sedan skrivit ett antal bash-specifika rader längre ner, exempelvis genom användande av ”[[” och annat.
Ser att denna tråd är lite gammal i och för sig, men kunde inte hålla tassarna borta…
Re: Skapa en .sh-fil som utför några kommandon
Postat: 27 feb 2012, 23:01
av ubot
Har själv haft problem (i Ubuntu 10.10) när jag skrivit ”#!/bin/sh” och sedan skrivit ett antal bash-specifika rader längre ner, exempelvis genom användande av ”[[” och annat.
Du vet väl at sh står för Bourne shell och bash för Bourne-Again shell? Om du har shebangen #!/bin/sh så är det inte konstigt om bash-syntax inte alltid fungerar i skriptet. Du måste ha #!/bin/bash för att skriptet ska köras som ett bash-skript. Eller har jag missuppfattat vad du försöker säga?
Edit:
Nu är jag med dig. Det stämmer att Ubuntu har sh länkat till dash. Kontrollera själv med:
Re: Skapa en .sh-fil som utför några kommandon
Postat: 28 feb 2012, 15:26
av m!rage
Johnny Rosenberg skrev:m!rage skrev:#!/bin/bash är inte strikt nödvändigt eftersom alla Ubuntuinstallationer ändå använder Bash som standard. Men det är förstås bra att vara övertydlig, särskilt om det är en dator man pratar med

Kanske stämmer för vissa versioner, men sh verkar i de flesta fall vara länkat till dash, inte bash.
Har själv haft problem (i Ubuntu 10.10) när jag skrivit ”#!/bin/sh” och sedan skrivit ett antal bash-specifika rader längre ner, exempelvis genom användande av ”[[” och annat.
Ser att denna tråd är lite gammal i och för sig, men kunde inte hålla tassarna borta…
Jo, det stämmer, men det skal som används som standard (dvs inloggningsskalet) är om jag förstått det rätt /bin/bash och inte /bin/sh:
Kod: Markera allt
# grep anton /etc/passwd
anton:x:1000:1000:Anton Eliasson,,,:/home/anton:/bin/bash