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

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

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

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

  • Почему bash интерпретирует символы, которые у меня есть?
  • Пути трубопроводов с различными типами котировок для замены косой черты
  • Выполняют ли программы, вызванные оболочкой, наследовать переменные оболочки?
  • кавычки, сгенерированные другим скриптом Bash, которые не обрабатываются как кавычки в исходном скрипте
  • Как передать имя файла, содержащее знаки процента (%), в качестве параметра для сценария оболочки в cron?
  • Сценарий Bash не может найти команду при цитировании
  • разрешение отклонено выполнение скрипта поверх ssh
  • Как написать команду для ключа Exec в файле .desktop, содержащем зарезервированный символ, правильно?
  • Zsh, возможно, добавляет кавычки к переменной значения (работает в bash, хотя)
  • Как эхо «одиночная кавычка» при использовании одиночной кавычки для обертывания специальных символов в оболочке?
  • Как сказать grep, чтобы соответствовать специальному символу в начале каждого слова
  • Пути трубопроводов с различными типами котировок для замены косой черты
  • 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 - лучшая ОС в мире.