shell скрипт: единични кавички при изпълнение

Имам проблем с използването на единични кавички в команда, изпълнена от шел скрипт. В моя скрипт изпълнявам команда rdesktop, която трябва да има -u '' (‹- 2 единични кавички) като параметър. Въпреки това, колкото и да се опитвам да избягам от кавичките, не се предава правилно.

Ако просто повторя $command, изходът е наред, ако го изпълня, се създава странен изход

Това е частта от скрипта, която не работи:

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

Също така се опитах да го изпълня директно:

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

Ще се радвам на всякаква помощ, тъй като прочетох доста уроци за екраниране на знаци в скриптове на shell и не намерих решението.

РЕДАКТИРАНЕ:

достатъчно интересно, ако просто използвам

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 с 3 аргумента, вторият от които е празният низ. Не ми е ясно защо се опитвате да го извикате в обратни точки, но можете да получите това, което искате, като използвате първата си дефиниция на команда и:

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

Наистина няма нужда да добавяте допълнително екраниране, тъй като единичните кавички не са специални в низ с двойни кавички.

РЕДАКТИРАНЕ: Когато всичко, което искате да направите с командата в променлива, е да я изпълните, имайте предвид, че това премахване на кавички се случва само веднъж:

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