Ausführen von verketteten Bash-Funktionsbefehlen im Hintergrund

270
codyc4321

Ich versuche anzurufen

port() { fuser -k $1/tcp; python manage.py runserver $1 ;} runproject() { cd $HOME/projects/$1 ; workon $1 ; port $2 & ; sleep 3 ; google-chrome 127.0.0.1:$2 ;} 

( portist ein Django-Server). auf Quelle fehlerhaft mit

cchilders:~/projects/scriptamajig [master]$ src bash: /home/cchilders/.bash_profile: line 134: syntax error near unexpected token `;' bash: /home/cchilders/.bash_profile: line 134: `runproject() { cd $HOME/projects/$1 ; workon $1 ; port $2 & ; sleep 3 ; google-chrome 127.0.0.1:$2 ;} ' 

Mein google-chromeBefehl lässt sich nicht öffnen, denke ich, weil port $2der Django-Server läuft und die Endpipe hogs. Das sleepTeil läuft nicht einmal nach der Port-Ausführung. Ich möchte portim Hintergrund laufen und danach weiter ketten; Wie lautet die Syntax für das Hintergrunding in einer Funktion (kein Alias)? Vielen Dank

0

2 Antworten auf die Frage

1
Gordon Davisson

Dies liegt nicht an der Funktion, sondern daran, dass Sie mehrere Befehle in einer Zeile verketten und diese voneinander ;trennen. Ist &aber bereits ein Befehlstrennzeichen, und die Verwendung beider Befehle ohne Befehl dazwischen (wie in ... port $2 & ; sleep 3 ...) ist ein Syntaxfehler. Lösung: Entweder das Redundante entfernen ;:

runproject() { cd $HOME/projects/$1 ; workon $1 ; port $2 & sleep 3 ; google-chrome 127.0.0.1:$2 ;} 

Oder verwenden Sie Zeilenumbrüche als Befehlstrennzeichen anstelle von ;:

runproject() { cd $HOME/projects/$1 workon $1 port $2 & sleep 3 google-chrome 127.0.0.1:$2 } 

... was mir lieber ist, weil ich es leichter zu lesen finde.

0
Some Linux Nerd

Sie können eine Bash-Funktion wie ein Programm hinterlegen

imahappyfunction() { sleep 50000 }  imahappyfunction &