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

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

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

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

  • замена внутри параллельной командной строки
  • Quotes exercise - как сделать ssh внутри ssh во время запуска sql внутри второго ssh?
  • bash добавляет дополнительные одинарные кавычки
  • Команда SSH с перенаправлением файлов не работает
  • rsync exclude-из каталога с пробелом
  • в чем разница между использованием «одиночных кавычек» или нет в команде find
  • Как передать аргументы в процесс Java из сценария оболочки
  • Awk не дает никакого результата
  • 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 
    Interesting Posts
    Linux и Unix - лучшая ОС в мире.