Vraag Hoe kan ik een script maken dat terminalvensters opent en daarin opdrachten uitvoert?


Ik heb drie scripts die ik moet uitvoeren wanneer ik mijn Ubuntu-machine start, ze starten services die ik gebruik in mijn ontwikkelomgeving.

Om dat te doen, open ik handmatig drie terminals en typ de opdrachten in.

Is er een manier om een ​​script te maken dat drie terminals opent en één commando uitvoert in elk van deze? (Elke opdracht moet in een apart terminalvenster staan, zodat ik hun uitvoer kan zien).


111
2018-06-02 19:58


oorsprong




antwoorden:


gnome-terminal -e opdracht

of

xterm -e opdracht

of

konsole -e opdracht

Ongeveer

terminal -e opdracht

Om ervoor te zorgen dat de terminal blijft staan ​​als de opdracht wordt afgesloten:

In Konsole is er een --noclose vlag.

In xterm is er een -hold vlag.

In gnome-terminal, ga naar Bewerk -> Profielvoorkeuren -> Titel. Klik op de Opdracht tab. kiezen Houd de terminal vast uit het vervolgkeuzemenu met het label Wanneer het commando wordt afgesloten. Maak daar een nieuw profiel voor en voer het uit met

gnome-terminal --window-with-profile =NAMEOFTHEPROFILE -e opdracht

112
2018-06-02 20:03



Als ik probeer de terminal vast te houden, krijg ik "kinderproces verlaten normaal met statuscode 127" - Darshan Chaudhary
gnome-terminal heeft niet meer de titeloptie :( - törzsmókus
@ törzsmókus Het werkt in Ubuntu 14.04 met gnome-terminal 3.6.2. Welke distro en versie van gnome-terminal gebruik je? - bhass1
16.04 LTS, gnome-terminal 3.18.3. @ bhass1 het is 2017 ... - törzsmókus
@ törzsmókus het is inderdaad 2017! LTS-releases hebben een ondersteunend leven van 5 jaar. 14.04 eindigt niet tot april 2019. wiki.ubuntu.com/Releases - bhass1


In plaats van hardcodes gnome-terminal, konsole, et cetera, gebruik het systeem Alternatieven. Het programma dat de standaard terminalemulator uitvoert is:

x-terminal-emulator

Op mijn systeem opent het een nieuw exemplaar van Konsole elke keer dat ik deze opdracht uitvoer.

Gelukkig lijkt de terminals de -e optie voor het uitvoeren van een opdracht (ik heb het geverifieerd voor konsole en gnome-terminal). Argumenten na het commando worden doorgegeven aan het aangeroepen commando. Bash weigert open te blijven in mijn terminal, een extra script is nodig om een ​​terminal te krijgen:

#!/bin/sh
"$@"
exec "$SHELL"

Als u het vorige script hebt opgeslagen als /home/user/hacky en maakte het uitvoerbaar, je zou je scripts draaien met:

x-terminal-emulator -e /home/user/hacky your-script optional arguments here

Het volledige pad is verplicht en /home/user/hacky moet uitvoerbaar zijn.

Mijn vorige poging om een ​​script in een nieuw terminalvenster uit te voeren, is te vinden in herziening # 2, het was voordat ik me realiseerde dat er argumenten konden worden doorgegeven x-terminal-emulator.


47
2018-06-02 20:29



In dit geval zal het niet veel helpen, aangezien de vrager iets wil doen dat niet voor alle terminals hetzelfde is. - nickguletskii
Poging # 3: deze moet de terminal open houden en het programma uitvoeren met optionele argumenten. - Lekensteyn
Ik gebruikte de gnome-optie, maar zodra ik mijn script heb uitgevoerd, sluit de hoofdterminal !! .. geen idee waarom? - Suda.nese
@ Suda.nese Dat is door het ontwerp, wanneer de "terminal" klaar is met het uitvoeren van het script zal het stoppen omdat er niets meer te doen is. Je zou dit kunnen "repareren" door een shell aan te roepen waar je opdrachten kunt uitvoeren (bash) of een regel zoals read -p "Press Return to continue". - Lekensteyn
Hoe kun je meer dan één commando uitvoeren in de terminal? Bijvoorbeeld cd xxx && start.sh. De interpreteerder ziet && als het tweede deel van het commando (wat logisch is), maar als ik het citeer, probeert het het hele ding uit te voeren als een groot argument - Richard


Heel eenvoudig-

#!/bin/bash

/etc/init.d/ccpd status

Dit is voldoende voor andere opdrachten die niets in terminal hoeven weer te geven. Maar hier moet de status worden weergegeven.
Dus het moet uitvoeren in een terminalvenster

#!/bin/bash

gnome-terminal -e "/etc/init.d/ccpd status"  --window-with-profile=NAMEOFTHEPROFILE

De andere post voorgenomen [] om een ​​tijdelijke aanduiding te zijn

Hier wordt "NAMEOFTHEPROFILE" vervangen door de naam van het profiel dat "de terminal vasthoudt wanneer de opdracht wordt afgesloten".

enter image description here

enter image description here


7
2018-01-23 09:31



@cipricus geloof ik [] was gewoon placeholder - Karthik T
begrepen. maar ik moet ervoor zorgen dat de terminal niet zo snel sluit. ik denk dat dat ook in de gekoppelde vraag staat - cipricus
@cipricus heb je het profiel geprobeerd? Moet gewoon toevoegen --window-with-profile=NAMEOFTHEPROFILE naar wat ik heb gegeven - Karthik T
@cipricus Ik zou naar huis moeten gaan om betere instructies te geven, maar het idee is om een ​​speciaal profiel te maken met die optieset en de naam van het speciale profiel te gebruiken op de plaats hierboven. - Karthik T
@cipricus als dat genoeg is voor jou, dan is dat goed. Profiel is niets meer dan een groep instellingen. U kunt de instellingen ALLEEN instellen voor gebruik in uw script en niet voor alle terminals. Je kunt Edit -> Profiles zien om alle profielen te zien die je hebt, en je zou er een toevoegen die was ingesteld zoals uitgelegd in het bericht dat je hebt gelinkt - Karthik T


commentaar geven op het antwoord van Lekensteyn. Ik weet dat dit een oud bericht is, maar voor iedereen die dit nuttig vindt (zoals ik net deed) In plaats van een ander "hacky-script" te maken met een functie in het script dat u aanroept

hacky_function()
{
"$@"
exec "$SHELL"
}

Roep je script met "x-terminal-emulator -e / path / to / script hacky_function optionele argumenten hier"

Vergeet niet om "$ @" aan het einde van het script te plaatsen


1
2017-12-06 20:11





Gebruik de schermopdracht en -d loskoppelen van een bestaande schermsessie en hier opnieuw aansluiten - forceer een nieuwe schermsessie -S maak een benoemde sessie in plaats van de standaardnaam te gebruiken


-2
2018-04-13 20:00



dit antwoord is helemaal niet duidelijk, maak het alstublieft begrijpelijker - azerafati
@azerafati inderdaad, het scherm opent geen terminalvenster ... is zelfs niet bedoeld door dat geweldige pakket ... - erm3nda