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

Kod: Markera allt

#!/bin/bash 

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

Kod: Markera allt

sleep 5

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:

Kod: Markera allt

ls -al /bin/sh

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