Skapa en .sh-fil som utför några kommandon

Här diskuterar vi skal, kommandon och klassiska linuxverktyg.
Trubbelgum
Inlägg: 5
Blev medlem: 12 aug 2011, 14:20
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS

Skapa en .sh-fil som utför några kommandon

Inlägg 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!
ubot
Inlägg: 4613
Blev medlem: 04 jan 2008, 14:03
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS

Re: Skapa en .sh-fil som utför några kommandon

Inlägg 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 
m!rage
Inlägg: 2550
Blev medlem: 28 apr 2009, 21:47
OS: Arch Linux
Ort: Lund

Re: Skapa en .sh-fil som utför några kommandon

Inlägg 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 :)
ubot
Inlägg: 4613
Blev medlem: 04 jan 2008, 14:03
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS

Re: Skapa en .sh-fil som utför några kommandon

Inlägg 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.
Trubbelgum
Inlägg: 5
Blev medlem: 12 aug 2011, 14:20
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS

Inlägg 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?
m!rage
Inlägg: 2550
Blev medlem: 28 apr 2009, 21:47
OS: Arch Linux
Ort: Lund

Re: Skapa en .sh-fil som utför några kommandon

Inlägg av m!rage »

Jag fattar inte riktigt resten av ditt skript men pausen fixar du med

Kod: Markera allt

sleep 5
Trubbelgum
Inlägg: 5
Blev medlem: 12 aug 2011, 14:20
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS

Re: Skapa en .sh-fil som utför några kommandon

Inlägg 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?
Användarvisningsbild
Adoby
Inlägg: 34
Blev medlem: 31 jul 2011, 01:04
OS: Ubuntu
Utgåva: 23.10 Mantic Minotaur

Re: Skapa en .sh-fil som utför några kommandon

Inlägg 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.
Trubbelgum
Inlägg: 5
Blev medlem: 12 aug 2011, 14:20
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS

Inlägg 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!
m!rage
Inlägg: 2550
Blev medlem: 28 apr 2009, 21:47
OS: Arch Linux
Ort: Lund

Re: Skapa en .sh-fil som utför några kommandon

Inlägg av m!rage »

Aha, du tänker fuska i ett spel? :)
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Skapa en .sh-fil som utför några kommandon

Inlägg 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…
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
ubot
Inlägg: 4613
Blev medlem: 04 jan 2008, 14:03
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS

Re: Skapa en .sh-fil som utför några kommandon

Inlägg 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
m!rage
Inlägg: 2550
Blev medlem: 28 apr 2009, 21:47
OS: Arch Linux
Ort: Lund

Re: Skapa en .sh-fil som utför några kommandon

Inlägg 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
Skriv svar

Återgå till "Terminalforum"