LINUX.ORG.RU

bash raw string

 , ,


0

1

Привет. Я правильно понимаю, что никак не могу в одну строку в консоли передать в stdin команду, чтобы bash её совсем никак не трогал? Я хочу передать строку как есть, со всеми кавычками и $.

То есть, например передать в cat всё до конца строки. Кавычки не подходят, потому что не хочется при каждом вводе их экранировать(моя строка может содержать кавычки). << EOF пытается интерполировать переменные.

Самое близкое, что нашёл:

cat <<< string
Но к сожалению работает только до пробела, два слова уже никак без кавычек.

Была идея передавать в комментарии, но он нигде не остаётся, даже в /proc/self/cmdline

Если это важно, пишу однострочник для мультиплексирования ssh. С кавычками всё ок, но их надо каждый раз экранировать.

★★★
Ответ на: комментарий от ziemin

Да, но если я захочу передать строку с одинарной кавычкой внутри, мне придётся её эскейпить, притом нетривиально

disarmer ★★★
() автор топика

Одинарные кавычки не катят? Их содержимое передаётся без изменений, проблема лишь одна - строка не может содержать одинарных кавычек:/

MiniRoboDancer ★☆
()
Ответ на: комментарий от disarmer

пример:

echo 'ssh server "mkdir '/123'"' | xargs ...
Но придётся эскейпить внутренние кавычки для каждой новой команды

disarmer ★★★
() автор топика
Ответ на: комментарий от MiniRoboDancer

В том и проблема что может содержать внутри одинарные кавычки, а их эскейпить муторно каждый раз

disarmer ★★★
() автор топика

enjoy your cancer

anonymous
()
Ответ на: комментарий от disarmer

Кстати можно подсократить. Если ты передаёшь heredoc на вход другой команде, можно сразу её указывать:

$ <<'EOF' hd      
echo $test
EOF
00000000  65 63 68 6f 20 24 74 65  73 74 0a                 |echo $test.|

ziemin ★★
()
Ответ на: комментарий от emulek

Из файла то да, но мне надо из командной строки передать. То есть, передать на stdin команды(cat в самом простом случае) строку, содержащую одинарные и двойные кавычки, не используя экранирования.

disarmer ★★★
() автор топика
Ответ на: комментарий от emulek

Больше наверное да, но текущий use-case таков, выполнить через ssh на сервере команду, содержащую одинарные и двойные кавычки. При этом не хочется экранировать кавычки вручную(поскольку в роли команды впоследствии будет какой то длинный однострочник с множеством кавычек)

Например

ssh server echo "That's impossible $$"
bash: -c: line 0: unexpected EOF while looking for matching `''
bash: -c: line 1: syntax error: unexpected end of file

disarmer ★★★
() автор топика
Ответ на: комментарий от disarmer

но текущий use-case таков, выполнить через ssh на сервере команду, содержащую одинарные и двойные кавычки.

а почему эта команда должна быть обязательно записана в теле скрипта?

Задача в принципе ИМХО не решаемая и бессмысленная. Разве что форкать скрипт предварительно обработав скрипт sed'ом. Картинка с троллейбусом будет кстати.

emulek
()
Ответ на: комментарий от emulek

а почему эта команда должна быть обязательно записана в теле скрипта?

Чтобы после ввода команды можно было её отредактировать и повторить, тут же в консоли, а не мучать какой то файл.

не решаемая

Так вот же, уже решили чуть выше, правда там в stdin читается, а уж в ssh подставить - дело техники. Я уж тоже было подумал что никак.

бессмысленная

Так это пока не конечная цель, это минимальный пример. Конечная цель - однострочник, параллельно выполняющий команду(которую не нужно экранировать) на нескольких ssh-серверах. Ну и jff опыт bash

disarmer ★★★
() автор топика
Ответ на: комментарий от disarmer

Чтобы после ввода команды можно было её отредактировать и повторить, тут же в консоли, а не мучать какой то файл.

наверное ты ещё не Ъ, и не выбрал, какой у тебя ЛЮБИМЫЙ РЕДАКТОР. Вот и мучаешься.

Так это пока не конечная цель, это минимальный пример. Конечная цель - однострочник, параллельно выполняющий команду(которую не нужно экранировать) на нескольких ssh-серверах.

ну я это файлами делаю.

Да, посмотри expect, этот костыль даже пароль умеет набирать.

emulek
()
Ответ на: комментарий от emulek

Как не крути, с файлом две операции, редактировать файл и выполнять, кажется не так удобно. А тут считай файл прямо в командной строке.

А чем файл потом выполняешь?

expect знаю, но вот как-то ни разу не понадобился еще.

disarmer ★★★
() автор топика
Ответ на: комментарий от disarmer

Как не крути, с файлом две операции, редактировать файл и выполнять, кажется не так удобно. А тут считай файл прямо в командной строке.

у нас с тобой разные представления об удобстве. Мне, если нужно две операции, я выполню две операции. Про unix-way слышал?

А чем файл потом выполняешь?

чем надо, тем и выполняю. Это удобно и гибко.

expect знаю, но вот как-то ни разу не понадобился еще.

ИМХО оно не нужно никогда. Пароли тоже. Пароль нужно набирать в интерактивном режиме, в неинетерактивном пароли это деление на ноль. Ну а всё остальное (кроме паролей) bash умеет и так.

emulek
()

пиши в файл, читай из файла

quest ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.