Ich versuche, einen Bash-Befehl über SSH zu senden ssh -q $REMOTE -x "command". Da ich mehrere Bash-Befehle habe, verwende ich << EOF.
Das Problem ist, dass der Befehl readlink eine leere Zeichenfolge zurückgibt, wenn ich das Ergebnis einer Variablen zuweise. Wenn ich es direkt anrufe, ist es nicht so.
Hier ist eine vereinfachte Version meines Codes:
ssh -q $REMOTE -x << EOF LINK="/path/to/my/link" # the link points to /path/to/my/file readlink $LINK # outputs /path/to/my/file TEST=$(readlink -f "$LINK") echo $TEST # outputs an empty string EOF
An diesem Punkt habe ich den gleichen Code in ein Shell-Skript auf dem Remote-Computer eingefügt und versucht, das Shell-Skript aufzurufen:
# remote machine "test-script" LINK="/path/to/my/link" # the link points to /path/to/my/file readlink $LINK # outputs /path/to/my/file TEST=$(readlink -f "$LINK") echo $TEST # outputs /path/to/my/file
Plötzlich funktioniert es, wenn ich das Remote-Skript anrufe, funktioniert alles gut, aber warum funktioniert es nicht über SSH?
Randnotiz: [Gibt es Namenskonventionen für Variablen in Shellskripten?] (Https://unix.stackexchange.com/a/42849/108618)
Kamil Maciorowski vor 5 Jahren
0
2 Antworten auf die Frage
2
Lewis M
Innerhalb dieses Dokuments werden Ihre Variablen auf der Quellenseite ausgewertet. Wenn Sie möchten, dass Ihre Variablen auf der Zielseite ausgewertet werden, deaktivieren Sie das $. Zum Beispiel,
Wenn ein Teil des Wortes in Anführungszeichen gesetzt wird, ist das Trennzeichen das Ergebnis der Entfernung von Anführungszeichen für Word, und die Zeilen im Here-Dokument werden nicht erweitert. Wenn Wort unquoted ist, werden alle Linien des hier-Dokument unterworfen Expansion in den Parameter, Kommandosubstitution und arithmetische Erweiterung, die Zeichenfolge \newlineignoriert wird, und \muss verwendet werden, um die Zeichen zu zitieren \, $und `.
Also entweder Flucht $(wie diese andere Antwort sagt) oder Verwendung << "EOF"(mit Anführungszeichen); Ansonsten wird die Syntax wie $variableund $(…)lokal aufgelöst.