Я нашел это решение, которое работает для меня, но я не понимаю, как оно работает, учитывая, что команда sed заключает свой собственный параметр в одинарные кавычки, а вся команда ssh также передается в одинарные кавычки. Это запускается из OSX (BSD).
ssh -t -p 22 root@thehost 'for user in $(/bin/ls -A1 /var/cpanel/users) ; do if grep -q RS=paper /var/cpanel/users/${user}; then sed -i 's/^RS=paper_lantern$/RS=x3/' /var/cpanel/users/${user}; fi; done'
Может ли кто-нибудь объяснить мне, почему это работает, и почему мне не нужно было избегать одинарных кавычек для команды sed - я нигде не могу найти ссылку? Спасибо.
Вы этого не делаете, потому что ваша строка sed не должна быть заключена в кавычки, и фактически на удаленном сервере она не цитируется.
То, что передается в качестве аргумента вашей команде ssh, выглядит так:
for user in $(/bin/ls -A1 /var/cpanel/users) ; do if grep -q RS=paper /var/cpanel/users/${user}; then sed -i s/^RS=paper_lantern$/RS=x3/ /var/cpanel/users/${user}; fi; done
И он отлично работает, потому что внутри аргумента вашей команды sed нет пробелов.
Если вы хотите передать аргумент sed с пробелами, вам следует избегать одинарных кавычек следующим образом:
'for user in $(/bin/ls -A1 /var/cpanel/users) ; do if grep -q RS=paper /var/cpanel/users/${user}; then sed -i '\''s/^RS=paper_lantern$/RS=x3/'\'' /var/cpanel/users/${user}; fi; done'
Используя одинарные кавычки, вы не можете избежать одинарных кавычек следующим образом: \'
Вы должны использовать уловку. Вы должны закрыть цитаты, избежать своего '
и повторно открыть котировки. ('\''
)