sshd дает команду bash для выполнения, поэтому она будет проходить через интерпретатор bash как на удаленной стороне, так и на той стороне, на которой вы выполняете скрипт. Давайте посмотрим на вашу команду:
VAR=`ssh $i "awk -F: '/^bar/ {print \$2}' /local/foo.txt"`
Вы правильно экранировали $2
для своего локального компьютера, чтобы выполняемый скрипт bash не интерпретировал его. Но все кавычки удаляются к тому времени, когда он достигает awk (я не совсем уверен, почему удаляются внутренние кавычки), и он выполняет это:
awk -F: /^bar/ {print $2} /local/foo.txt
bash на удаленной стороне видит $ 2 и заменяет его пустой строкой, оставляя вас с этим:
awk -F: /^bar/ {print } /local/foo.txt
Вот почему он печатает всю строку. Так как же это исправить? Вы можете избежать того, что bash на удаленной стороне будет выполнять с косой чертой, например:
VAR1=`ssh $i localhost "echo awk -F: '/^bar/ {print \\\$2}' /local/foo.txt"`
Кроме того, вы можете просто повторить команду, чтобы увидеть, что на самом деле выполняет bash, чтобы отладить любые возникающие проблемы:
VAR1=`ssh $i localhost "echo awk -F: '/^bar/ {print \$2}' /local/foo.txt"`
echo VAR1: $VAR1
Execute it and see this output and see right away that it has removed $2:
VAR1: awk -F: /^bar/ {print } /local/foo.txt