.bash_profile: Zeile 260: Syntaxfehler in der Nähe des unerwarteten Tokens `('

915
codyc4321

Ich habe Bash-Funktion:

WORKING_REACT_EXAMPLES="$HOME/tutorials/javascript/react/working-react-examples" dualpush() { cd $WORKING_REACT_EXAMPLES; cmpushall "$1"; cd ..; cmpushall $1; cd $WORKING_REACT_EXAMPLES ;} 

es sieht ähnlich aus wie meine anderen Funktionen. Wenn ich versuche, .bashrc zu beziehen, bekomme ich

$ src -bash: /Users/cchilders/.bash_profile: line 260: syntax error near unexpected token `(' -bash: /Users/cchilders/.bash_profile: line 260: `dualpush() { cd $WORKING_REACT_EXAMPLES; cmpushall "$1"; cd ..; cmpushall "$1"; cd $WORKING_REACT_EXAMPLES ;}' 

Shellcheck warnt davor, etwas doppelt zu zitieren, sagt jedoch keine Fehler, also tue ich es

dualpush() { cd "$WORKING_REACT_EXAMPLES"; cmpushall "$1"; cd ..; cmpushall "$1"; cd "$WORKING_REACT_EXAMPLES" ;} 

und den gleichen Fehler bekommen

Was verursacht den Syntaxfehler? Vielen Dank

-2
Die Fehlermeldung lautet "Zeile 260". Sie haben nur zwei Zeilen angezeigt. Wie sieht der Rest der Datei aus? grawity vor 7 Jahren 3
Der Rest der Datei ist für das Problem nicht relevant, dies ist Zeile 260. Wenn Sie diese Zeile auskommentieren, wird das Problem behoben, sodass sich das Problem in dieser Zeile befindet. Ich habe es trotzdem hinzugefügt codyc4321 vor 7 Jahren 0
Scheinbare falsche Syntaxfehler werden oft durch subtile Syntaxfehler verursacht, die ihnen vorausgehen. Zwischen dem Punkt, den der Parser aufgegeben hat, und der eigentlichen Ursache kann ein gewisser Abstand vorliegen. Daniel B vor 7 Jahren 2
das ist wahr, bash ist so schwierig codyc4321 vor 7 Jahren 0

2 Antworten auf die Frage

1
grawity

Dies geschieht normalerweise, wenn der Funktionsname bereits als Alias mit Parametern definiert ist.

Die Substitution von Aliasen tritt beim Shell-Parsing ziemlich früh auf und wirkt sich daher auch auf Funktionsdeklarationen (und andere Dinge) aus. Wenn Sie zum Beispiel Folgendes hatten:

alias dualpush="push; push --again"  dualpush() { push; push --again; } 

... dann würde es erweitert werden auf:

push; push --again() { push; push --again; } 

Wenn der ursprüngliche Alias ​​mit einem Befehl ohne Parameter endet, funktionieren die Dinge weiterhin, aber die Funktion ist unter einem falschen Namen definiert (unter anderem mögliche Überraschungen!). Wenn der letzte Befehl in diesem Alias jedoch einige Argumente enthält, wird die Erweiterung nicht mehr als Funktionsdeklaration erkannt. Stattdessen wird der ()Befehl in der Mitte eines Befehlszeilenarguments angezeigt und vom Parser zurückgewiesen.

richtig; Ich hatte den Alias ​​zuerst definiert und wahrscheinlich ausfindig gemacht. Nachdem entschieden wurde, dass die bash-Funktion erforderlich war, steckte der Alias ​​in meinem Terminal. Dieses Problem tritt also auf, weil ich bei der Arbeit mein bash-Zeug schreibe, wenn ich nicht müde bin, nicht wegen Macs. Ty codyc4321 vor 7 Jahren 0
0
codyc4321

Nach dem Schließen des Terminals funktioniert derselbe Befehl. Mac hat Fehler bei der Verwendung von Bash-Funktionen, und nachdem er bashrc mit auskommentiertem Ausgang gefunden dualpushhat, bleibt er im Terminal. Beim Neustart des gesamten Terminals funktioniert derselbe Befehl. Ich habe kein Verständnis für dieses schlechte Verhalten, aber das passiert mir auf Ubuntu nicht

"Nachdem bashrc mit dualpush auskommentiert wurde, bleibt es im terminal." - Natürlich. Dies ist erwartetes Verhalten. Sie löschen es doch nicht. Sie definieren es auch nicht neu, also bleibt es so wie es ist. Daniel B vor 7 Jahren 1
Ich muss es vorher nicht bemerkt haben. Sourcing fügt nur hinzu; das macht Sinn, da das Terminal keine Dinge löschen kann, nur weil sie nicht in bashrc sind; ty codyc4321 vor 7 Jahren 0
Was mich überrascht hat, ist, dass selbst wenn ich dasselbe beibehalten habe, es einen alten Fehler findet und mich nicht zur Quelle lässt. In Ubuntu erhalte ich den neuen, korrekten Befehl codyc4321 vor 7 Jahren 0