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

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

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

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

  • разрешение отклонено выполнение скрипта поверх ssh
  • Синтаксическая ошибка с переменной, содержащей кавычки
  • Параллель GNU: событие не найдено (! ~)
  • Хранить кавычки в переменной для использования в качестве параметра командной строки Bash
  • bash добавляет дополнительные одинарные кавычки
  • find: отсутствующий аргумент `-exec '
  • Xargs с несколькими записями аргументов - используйте аргумент переменной окружения после sh -c '...'
  • Почему мое grep + regex не работает?
  • 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 - лучшая ОС в мире.