Eerst en vooral; als je eenmaal een proces hebt gestart, kun je het op de achtergrond zetten door het eerst te stoppen (druk op Ctrl-Z) en dan op bg
te typen om het op de achtergrond te laten hervatten. Het is nu een “job”, en zijn stdout
/stderr
/stdin
zijn nog steeds verbonden met uw terminal.
U kunt een proces als achtergrond starten door een “&” toe te voegen aan het einde ervan:
firefox &
Om het op de achtergrond tot zwijgen te brengen, gebruik je dit:
firefox </dev/null &>/dev/null &
:
nohup
is een programma dat je kunt gebruiken ** om je applicatie te draaien met** zodat de stdout/stderr in plaats daarvan naar een bestand kan worden gestuurd en zodat het sluiten van het ouderscript het kind niet zal SIGHUPen. U moet echter wel de vooruitziende blik hebben gehad om het te kunnen gebruiken voordat u de applicatie start. Vanwege de manier waarop nohup
werkt, kunt u het niet gewoon toepassen op een lopend proces.
disown
is een bash builtin die een shell-job uit de takenlijst van de shell verwijdert. Wat dit in principe betekent is dat je fg
, bg
er niet meer op kunt gebruiken, maar wat nog belangrijker is, als je je shell sluit zal het niet meer hangen of een SIGHUP
naar dat kind sturen. In tegenstelling tot nohup
, wordt disown
gebruikt na het proces is gestart en op de achtergrond geplaatst.
Wat je kan niet doen, is de stdout/stderr/stdin van een proces veranderen nadat je het hebt gestart. Tenminste niet vanuit de commandoregel. Als je je proces start en zegt dat de stdout je terminal is (wat je standaard doet), dan wordt dat proces geconfigureerd om naar je terminal uit te voeren. Uw shell heeft niets te maken met de FD-setup van de processen, dat is puur iets wat het proces zelf beheert. Het proces zelf kan beslissen of het zijn stdout/stderr/stdin sluit of niet, maar u kan uw shell niet gebruiken om het te forceren.
Om de uitvoer van een achtergrondproces te beheren, hebt u tal van opties van scripts, “nohup” is waarschijnlijk de eerste die in gedachten komt. Maar voor interactieve processen begin je maar vergeet je te zwijgen (firefox < /dev/null &>/dev/null &
) kun je niet veel doen, echt waar.
Ik raad je aan om GNU screen
te krijgen. Met het scherm kun je gewoon je draaiende shell sluiten als de uitvoer van het proces een last wordt en een nieuwe openen (^Ac
).
Oh, en trouwens, gebruik “$@
” niet waar je het gebruikt.
$@
betekent, $1
, $2
, $3
…, wat je commando zou veranderen in:
gnome-terminal -e "vim $1" "$2" "$3" ...
Dat is waarschijnlijk niet wat je wilt, want -e neemt slechts een argument. Gebruik $1
om te laten zien dat je script maar één argument kan verwerken.
Het is echt moeilijk om meerdere argumenten goed te laten werken in het scenario dat je gaf (met de gnome-terminal -e
) omdat -e
maar één argument neemt, wat een shell commando string is. Je zou je argumenten moeten coderen tot één. De beste en meest robuuste, maar nogal cludgy, manier is als volgt:
gnome-terminal -e "vim $(printf "%q " "$@")"