Цитирование: loop over ssh-accounts, вызов psql на удаленном сервере

Это работает в человеческом мозге, но оболочка пропускает цитирование:

for h in ab; do ssh $h psql -tAc "select * from mytab where mycol='x'"; done 

Как процитировать этот один лайнер, не теряя удобочитаемости?

  • Возможно ли избежать кавычек в кавычках эвакуации в кавычках эвакуации в кавычках эвакуации?
  • передать аргумент аргумента string в sh-скрипте
  • Почему bash интерпретирует символы, которые у меня есть?
  • разрешение отклонено выполнение скрипта поверх ssh
  • Как использовать multiline как group-separator в grep?
  • Несколько команд с котировками после SSHing
  • Подстановка Bash с переменной, определенной из шаблона glob
  • mkdir несколько каталогов с именем подкаталога, имеющим в нем пробел
  • One Solution collect form web for “Цитирование: loop over ssh-accounts, вызов psql на удаленном сервере”

    Вам нужно избегать цитат. Думайте о них как обертываниях, в игре прохождения посылки. Каждая оболочка распаковывает «слой».

    Так:

     echo "this ; is a semicolon" 

    Но если вы хотите запустить это через ssh:

     ssh $user@$host echo "this ; is a semicolon" 

    Ssh разворачивает первый слой пакета – отправляет:

     echo this ; is a semicolon 

    Что бы сломалось, потому что точки с запятой интерпретируются оболочкой.

    Чтобы сделать это, вам нужно сначала избежать котировок – так что ssh может «развернуть» один слой безопасно:

     ssh $user@$host echo "\"this ; is a semicolon\"" 

    Таким образом, ssh удаляет «внешний» слой и «побег» и проходит:

     echo "this ; is a semicolon" 

    Это будет то, что вам нужно сделать для вашего одного лайнера. Что касается того, чтобы не потерять удобочитаемость – проще сказать, чем сделать, я боюсь, так как побеги и цитаты вложенности неизбежно становятся беспорядочными.

    О лучшем, что я могу предложить, это использовать переменную для инкапсуляции вашего оператора SQL, так что, по крайней мере, ясно, что вы отправляете «инкапсулированный оператор»:

     THING_TO_ECHO='"this ; is a semicolon"'; ssh $user@host echo $THING_TO_ECHO 
    Linux и Unix - лучшая ОС в мире.