Привет.
ssh [email protected] "bash -lc 'pm2 list | grep app | awk { print $3} '"
Мне нужно выполнить команду, которую я сюда вставил. Проблема в том, что я уже дважды экранирую... bash с помощью "
и pm2 с помощью '
. Как мне экранировать awk?
Я знаю, что это сработает, если я экранирую его с помощью awk '{ print $3 }', но команда all уже экранирована дважды... так что... что мне делать?
обновлять
Я создал следующую команду bash:
PM2_APP_ID=`$REMOTE_SRV_SSH_COMMAND "bash -lc \"pm2 list | grep app | grep -v 'pm2 show' | awk '{ print \\\$4 }'\""`;
здесь я получаю все строки, соответствующие списку pm2, как будто awk никогда не выполнялся.
решение1
Вы не можете экранировать одинарные кавычки с помощью обратного слэша внутри строк в одинарных кавычках, но вы можете экранировать двойные кавычки с помощью обратного слэша внутри строки в двойных кавычках. Так что вы можете сделать так:
ssh [email protected] "bash -lc \"pm2 list | grep app | awk '{ print \\\$3 }'\""
Вам нужно экранировать символ $ в программе awk дважды, чтобы избежать расширения $3, сначала локальной оболочкой, а затем удаленной.
решение2
спасибо @dave_thompson_085 за ваш комментарий, он помог мне решить проблему.
Я использую следующую команду:
PM2_APP_ID=`$REMOTE_SRV_SSH_COMMAND "bash -lc 'pm2 list'" | grep app | grep -v 'pm2 show' | awk '{ print $4 }'`;
как вы можете видеть, я использую список pm2 на сервере удаления, а все остальное я делаю локально. никаких проблем с экранированием вещей, и все работает правильно.