2021-02-08, 14:51
  #1
Medlem
( speaker-test -t sine -f 350 )& pid=$! ; sleep 1s ; kill -9 $pid


kommandot kör en sinusvåg som testsignal, jag är mycket intresserad av att förstå mig på det och har tittat i en tutorial om bash och testar här nu.

Det som intresserar mig är pid-delen som jag vet är id för en process, vad menas med ()& pid=$! och $pid, särskilt $ är intressant och &. Jag kan programmera men inte detta språk.

Tack på förhand.
Citera
2021-02-08, 14:58
  #2
Moderator
vhes avatar
Koden kanske är lättare att förstå om man bryter upp den på separata rader:
Kod:
 ( speaker-test -t sine -f 350 )& 
pid=$!
sleep 1s
kill -9 $pid

Rad 1: Kör programmet speaker-test, och lägg det i bakgrunden genom att avsluta med operatorn &.
[edit]: Att kommandot står inom parantes gör att det körs i ett subshell, vilket är helt onödigt i det här fallet, eftersom det bara är ett kommando.

Rad 2: Ta den startade processens PID (process-ID), som ligger i den implicita variabeln $!, och spara den i variabeln pid.

Rad 3: Vänta i en sekund.

Rad 4: Slå (på ett överdrivet hårt sätt) ihjäl processen vars process-ID ligger i variabeln pid.
__________________
Senast redigerad av vhe 2021-02-08 kl. 15:52.
Citera
2021-02-08, 22:15
  #3
Medlem
Citat:
Ursprungligen postat av vhe
Koden kanske är lättare att förstå om man bryter upp den på separata rader:
Kod:
 ( speaker-test -t sine -f 350 )& 
pid=$!
sleep 1s
kill -9 $pid

Rad 1: Kör programmet speaker-test, och lägg det i bakgrunden genom att avsluta med operatorn &.
[edit]: Att kommandot står inom parantes gör att det körs i ett subshell, vilket är helt onödigt i det här fallet, eftersom det bara är ett kommando.

Rad 2: Ta den startade processens PID (process-ID), som ligger i den implicita variabeln $!, och spara den i variabeln pid. Döps variabeln till $ här?

Rad 3: Vänta i en sekund.

Rad 4: Slå (på ett överdrivet hårt sätt) ihjäl processen vars process-ID ligger i variabeln pid.

Implicit variabel?
Citera
2021-02-08, 23:14
  #4
Moderator
vhes avatar
Citat:
Ursprungligen postat av anderssson
Implicit variabel?

En variabel som sätts automatiskt av skalet. Just $! sätts automatiskt till PID på det sista kommandot i senaste pipelinen som startats i bakgrunden.

Däremot så var det kanske inte "implicit variabel" någon etablerad term. Special Parameters kallas de visst, enligt dashs manual-sida. Vad bash kallar dem orkar jag inte ta reda på, då den manualsidan är längre än Shakespeares samlade...
Citera
2021-02-09, 13:51
  #5
Medlem
Citat:
Ursprungligen postat av vhe
Koden kanske är lättare att förstå om man bryter upp den på separata rader:
Kod:
 ( speaker-test -t sine -f 350 )& 
pid=$!
sleep 1s
kill -9 $pid

Rad 1: Kör programmet speaker-test, och lägg det i bakgrunden genom att avsluta med operatorn &.
[edit]: Att kommandot står inom parantes gör att det körs i ett subshell, vilket är helt onödigt i det här fallet, eftersom det bara är ett kommando.

Rad 2: Ta den startade processens PID (process-ID), som ligger i den implicita variabeln $!, och spara den i variabeln pid.

Rad 3: Vänta i en sekund.

Rad 4: Slå (på ett överdrivet hårt sätt) ihjäl processen vars process-ID ligger i variabeln pid.

Citera
2021-02-09, 13:53
  #6
Medlem
Citat:
Ursprungligen postat av anderssson
Implicit variabel?

läste om det och det verkade betyda att en funktion returnerar en variabel trots att funktionen inte är satt att göra det. Den sista variabeln returneras eller nåt sånt.
Citera
2021-02-09, 14:58
  #7
Moderator
vhes avatar
Citat:
Ursprungligen postat av chelchele
läste om det och det verkade betyda att en funktion returnerar en variabel trots att funktionen inte är satt att göra det. Den sista variabeln returneras eller nåt sånt.

En funktion returnerar exitkoden från det sista exekverande kommandot. Det är dock inte vad det rör sig om när det gäller $!. Den variabeln sätts av skalet till process-ID av det senaste kommandot som lagts i bakgrunden.

exitkod är ett tal som används för att indikera ungefär hur det gick. Tumregeln är att om den är noll så gick det bra, är den nått annat så gick det dåligt på ett eller annat vis. En exitkod finns så klart inte förrän processen är färdig.

process-ID, däremot, finns tvärt emot exitkod, endast så länge processen kör (well, sanning med lite modifikation, men det är typ sant) och används för att identifiera processen. Så de är väldigt olika saker.
Citera
2021-02-09, 20:39
  #8
Medlem
Citat:
Ursprungligen postat av vhe
En variabel som sätts automatiskt av skalet. Just $! sätts automatiskt till PID på det sista kommandot i senaste pipelinen som startats i bakgrunden.

Däremot så var det kanske inte "implicit variabel" någon etablerad term. Special Parameters kallas de visst, enligt dashs manual-sida. Vad bash kallar dem orkar jag inte ta reda på, då den manualsidan är längre än Shakespeares samlade...
Vet inte om du svarade på min fråga den är inbakad i citeringen.

*Sätts namnet här*
Citera
2021-02-10, 18:46
  #9
Moderator
vhes avatar
Citat:
Ursprungligen postat av anderssson
Vet inte om du svarade på min fråga den är inbakad i citeringen.

*Sätts namnet här*

Oj! Det var ett exceptionellt obskyrt sätt att ställa frågan. Jag rekommenderar dig varmt att inte baka in dina frågor i texten du citerar framöver, det är väldigt lätt att de missas.

Namnet är inte $, namnet är snarare !, eller pid, beroende på vilken du frågade efter. Alla variabler refereras sedan till med ett inledande $-tecken. Men variabeln $! får sitt värde på första raden. Variabeln $pid får sitt värde på rad två. Fortfarande osäker på vad du egentligen frågade, så vet inte om det besvarade frågan.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in