2016-07-13 33 views
0

Ich muss eine Variable innerhalb eines Backtick-Ausdrucks in einem rcp Aufruf eingebettet verwenden.Verwendung von Backtick-Ausdruck mit Variable in einem rcp-Befehl eingebettet

Mein erster Versuch:

#!/bin/sh 
release=1 
rcp myserver.foo.com:'`ls -t /path/to/my/${release} | head -n 1`' . 

Ich nehme an, dies fehlschlägt, weil die Rücken-tick-Expression auf myserver.foo.com ausgeführt wird, die keine release Variable hat, so das Argument meinen ls Befehl ist nur /path/to/my/ .

Ich read dass normalerweise der eval Befehl verwendet werden kann (ich denke) den Back-Tick-Ausdruck vorverarbeiten. Wenn ich diesen Ansatz versuchen:

#!/bin/sh 
release=1 
rcp myserver.foo.com:'`ls -t /path/to/my/eval ${release} | head -n 1`' . 

... ist der Graviszeichen Ausdruck wie /path/to/my/eval ausgeführt.

Wie kann ich Variablen in meinem Backtick-Ausdruck in diesem Kontext verwenden?

Um klar zu sein: Ich bin versucht, den Code in Back-Zecken auf dem Remote-Server laufen zu haben, nicht vor Ort (aber ich brauche ${release} vor Hand lokal gelöst werden)

Antwort

1

die ls auf denen sie laufen die entfernte, aber erweitern $ Freigabe auf den Wert auf dem lokalen Rechner, müssen Sie verschiedene Anführungszeichen verwenden. Um die Variable $ release lokal zu erweitern, muss sie in Anführungszeichen und nicht in einzelnen Anführungszeichen stehen. Sie können erreichen, dass mit:

#!/bin/sh 
release=1 
scp myserver.foo.com:'$(ls -t /path/to/my/'"${release}"' | sed 1q)' . 

Wenn es ungewöhnliche Zeichen (zB Leerzeichen) in den Dateinamen, werden Sie wahrscheinlich wollen mehr Zitate hinzufügen:

scp myserver.foo.com:'"$(ls -t /path/to/my/'"${release}"' | sed 1q)"' . 

Beachten Sie, dass Sie wahrscheinlich wollen addiere den vollen Pfad:

scp myserver.foo.com:/path/to/my/"$release"/'"$(ls -t /path/to/my/'"${release}"' | sed 1q)"' . 
+0

Danke, aber muss das erste '$' escape ('\ $') sein? Es funktionierte, nachdem ich es entkam ... –

+0

Das erste '$' sollte nicht maskiert werden müssen. –

+0

Es scheint, dass die von Ihnen geposteten Lösungen dazu führen, dass der zuvor mit einem Häkchen versehene Befehl lokal statt auf "myserver.foo.com" ausgeführt wird. Aber wenn ich dem '$' Charakter entgehe, funktioniert es ... also danke! Du hast mich über meine Hürde gebracht! –