Intereting Posts
Вопрос AWK: напечатайте N строк, начиная с третьей строки после указания / pattern / sed with = в качестве разделителя Где скачать Chrome 32bit, поскольку он был прекращен Google? Почему мой сценарий оболочки задыхается от пробелов или других специальных символов? Как избежать того, что шаблон вставки с использованием sed применяется к середине строки? Что происходит после набора USB 3G-модема Не удается подключить разъем RFCOMM: хост отключен Проверить пароль для учетной записи пользователя из сценария оболочки Linux перестает загружаться после ссылки eth0. Как заставить его показывать больше журнала? Можно ли изменить расположение файла конфигурации в haproxy? Не удалось обновить или установить с помощью apt-get Изменить права доступа к папке Используйте различные критерии фильтрации с размером пакета tcpdump Невозможно выполнить двойную загрузку Fedora Опция gnome – terminal -e не выполняется?

Что-то не так с пространством в zenity, пытающимся создать скрипт

Хотя это прямо выполняется в терминале, он отлично работает

zenity --info --text "pure info" --title "get info" 

Но этот сценарий не работает, что случилось?

 !/bin/bash ZEN="--info --text \"pure info\" --title \"get info\"" zenity $ZEN 

Сценарий выводится как «информация в тексте» и «jeevan в заголовке». Он пропускает оставшуюся часть.
Это потому, что пространство (специальный символ) теряет свое особое значение внутри двойных кавычек?

Разница в том, что команда zenity видит несколько аргументов в первом случае и только одну (включая много пробелов) во втором.

С помощью следующей awk программы вы можете быстро выводить то, что оболочка расширяет аргументы. Как бы то ни было, zsh я мог бы воспроизвести вашу проблему:

 % awk 'BEGIN {for (i in ARGV) print "ARGV["i"] =", ARGV[i]}' $ZEN ARGV[0] = awk ARGV[1] = --info --text "pure info" --title "get info" 

Если в bash это выглядит почти так, как должно выглядеть (обратите внимание, что цитируемые строки разделены словами):

 $ awk 'BEGIN {for (i in ARGV) print "ARGV["i"] =", ARGV[i]}' $ZEN ARGV[0] = awk ARGV[1] = --info ARGV[2] = --text ARGV[3] = "pure ARGV[4] = info" ARGV[5] = --title ARGV[6] = "get ARGV[7] = info" 

Должна быть опция разделения слова оболочки, ответственная за это поведение.

Это, однако, сработало:

 set -- --info --text "pure info" --title "get info" zenity "$@" 

Редактировать:

Оболочки немного глупые с разбиением слова по умолчанию, см. Пример в примере bash выше: "pure и info" – это два отдельных слова. Поскольку это раздражает при анализе параметров командной строки, в обработке "$@ была создана специальная функциональность. Цитирование справочника bash , раздел Специальные параметры:

  @ Expands to the positional parameters, starting from one. When the expansion occurs within double quotes, each parameter expands to a separate word. That is, "$@" is equivalent to "$1" "$2" ... 

Я не нашел способ получить специальное обращение к $@ в нормальное переменное расширение, но может быть трюк.

Команда set задает позиционные параметры: $1 , $2 , … Таким образом, доступна set «Дайте мне все» – позиционные параметры $@ .

Одним из решений этой проблемы является оценка всего выражения, так что кавычки внутри строки анализируются:

 eval zenity "$ZEN" 

Кстати, вы также можете использовать одинарные кавычки в определении переменных вместо того, чтобы сбрасывать двойные кавычки:

 ZEN='--info --text "pure info" --title "get info"' 

И BTW2, у вас отсутствует # перед !/bin/bash .

Если вы используете zsh, альтернативный метод состоит в том, чтобы разбить этот параметр на слова, используя разбор синтаксического анализа (с учетом цитирования) с помощью флага z , то есть:

 zenity "${(z)ZEN}"