сценарий оболочки: одинарная кавычка при выполнении

У меня возникли проблемы с использованием одинарной кавычки в команде, выполняемой из сценария оболочки. В моем сценарии я выполняю команду rdesktop, которая должна иметь -u '' (‹- 2 одинарные кавычки) в качестве параметра. Однако, как бы я ни пытался избежать кавычек, это не передается правильно.

Если я просто повторю $command, вывод будет в порядке, если я его выполню, будет создан странный вывод

Это часть скрипта, которая не работает:

command="rdesktop -u "\'\'" $server"
`$command`

Я также попытался выполнить его напрямую:

`rdesktop -u "\'\'" $server`

Я был бы признателен за любую помощь, так как я прочитал немало руководств по экранированию символов в сценариях оболочки и не нашел решения.

РЕДАКТИРОВАТЬ:

интересно, если я просто использую

command=rdesktop -u '' $server

и повторите это, вывод в порядке, однако, если я выполню его с помощью

$command

это не удается...


person David Froehlich    schedule 24.05.2012    source источник
comment
как насчет rdesktop -u "''" $server ?   -  person Andreas Wong    schedule 24.05.2012
comment
Разве это не должно быть на суперпользователях?   -  person Christopher Creutzig    schedule 24.05.2012


Ответы (3)


Если ваша оболочка bash, ksh или zsh, гораздо безопаснее и проще создать команду с массивом, а не со строкой:

command=( rdesktop -u '' $server )

и выполнить его так

"${command[@]}"

Я не могу себе представить, что удаленному серверу нужно видеть имя пользователя, названное буквально '' (т.е. 2 одинарные кавычки) - вероятно, ему нужна просто пустая строка.

person glenn jackman    schedule 24.05.2012
comment
@derFunk, нет, только если вы хотите зафиксировать вывод. Когда вы сделаете это echo foo, вы увидите foo; когда вы делаете это $(echo foo), вы отправляете результат подстановки команд в оболочку для выполнения в виде команды — вы получите foo: command not found - person glenn jackman; 02.05.2014

Когда вы вызываете rdesktop -u '' $server, вы вызываете rdesktop с тремя аргументами, второй из которых — пустая строка. Мне непонятно, почему вы пытаетесь вызвать его обратными кавычками, но вы можете получить то, что хотите, используя свое первое определение команды и:

eval $command

Обратите внимание, что если вы не полностью контролируете содержимое $server, то это большой риск для безопасности. (Например, если сервер представляет собой строку ; cmd, то вызов eval выполнит cmd)

person William Pursell    schedule 24.05.2012

Во-первых, если вы наберете

`rdesktop something`

тогда это означает вызвать rdesktop, взять вывод и запустить этот вывод как команду. Чтобы «выполнить его напрямую», просто введите

rdesktop something

Теперь о цитатах. Если вы выполните

rdesktop -u '' $server

то rdesktop не увидит кавычки. Они удаляются как часть разбора команды оболочкой. Чтобы заставить rdesktop видеть аргумент '', используйте

rdesktop -u "''" $server

На самом деле нет необходимости добавлять какое-либо дополнительное экранирование, поскольку одинарные кавычки не являются особыми внутри строки с двойными кавычками.

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

cmd="rdesktop -u '' $server"
$cmd
person Christopher Creutzig    schedule 24.05.2012
comment
Хм, к сожалению, у меня это не работает, если я использую cmd="rdesktop -u \"''\" $server", он передает '' в качестве параметра, а не '' - person David Froehlich; 24.05.2012
comment
Отредактировано. Хотя я все еще не думаю, что ваше удаленное имя пользователя на самом деле состоит из двух одинарных кавычек. - person Christopher Creutzig; 24.05.2012