2016-11-24 3 views
1

Я хотел бы пройти путь потенциально содержащий пробелы в su -c команду внутри .sh сценария:избежать кавычки внутри су -c

su -c "xdg-desktop-menu install ${DesktopFile}" -m "${Username}" 

$ DesktopFile мой путь, который должен получить убежали. Я пробовал много вариантов с ' внутри "", с \" и несколькими брекетами, но у меня не было решения. Интересно, что xdg-desktop-icon отлично работает, но xdg-desktop-menu умирает в пробеле. Какие-либо предложения?

ответ

0

Если вы используете bash, printf '%q' может использоваться для вызова специальных символов при недостаточном цитировании.

su -c "xdg-desktop-menu install $(printf '%q' "$DesktopFile") -m $(printf '%q' "$Username")" 

Обратите внимание, что $(printf...) не нуждается в кавычки, но "$DesktopFile" делает. Переменная должна быть безопасно передана в printf, поэтому ее нужно указывать. Выходной сигнал printf '%q' гарантированно невосприимчив к расщеплению и глобализации слов, поэтому ему не нужны кавычки. (Хотя, если бы вы хотели процитировать его, вы могли бы. Ему понадобилось бы с обеих сторон.)

+0

спасибо. 2 вопроса: а) я хотел использовать sh вместо bash, поэтому нет% q, и b) -m - это опция для su, а не xdg-desktop-menu, поэтому кавычки немного изменятся. б) я могу решить, но а) проблема ... любые предложения для printf% q на sh? – broozar

+0

ok, переключился на/bin/bash для тестирования и нашел это: 'FFQ = $ (printf '% q'" $ DesktopFile ")' 'su -c" xdg-desktop-menu install $ FFQ "-m" $ Имя пользователя "' по-прежнему расщепляется после пробела. – broozar

+0

нашел (n более старый) отчет об ошибке для xdg-desktop-меню и пробелов, даже если он прошел правильно. возможно, у моей версии все еще есть эта ошибка. – broozar

0

Я не могу разобраться, если это ошибка в xdg-desktop-меню, так как она работает в xdg- настольный значок, тем не менее, есть обходной путь я сейчас с помощью:

cd "$PathWithSpaces" 
su -c "xdg-desktop-menu install $DesktopFilenameWithoutSpaces" -m "$Username" 

PathWithSpaces содержит DesktopFilenameWithoutSpaces, кажется, надежно работать.

Смежные вопросы