Переменная внутри Zenity внутри `sh -c` игнорируется

Сценарий ниже должен открыть окно ввода, чей начальный текст записи является значением $filename, но секция zenity в третьей строке игнорирует эту переменную, и я не получаю входной текст.

Кстати, если я просто заменю filename от whoami, мое имя пользователя будет отображаться как ожидалось. Однако я не могу получить результат, используя свои собственные переменные. Это проблема.

#!/bin/bash
filename="duck"
sh -c 'chromium-browser "https://duckduckgo.com/?q=%5C$(zenity --entry --text "I am feeling ducky" --entry-text $(filename))"'

И если бы я удалил sh -c В общем, в конечном итоге с кодом ниже, моя переменная будет работать с zenity.

#!/bin/bash
filename="duck"
zenity --entry --text "I am feeling ducky" --entry-text $filename

Есть какие-нибудь подсказки, почему? Я пытался играть с разными комбинациями цитат, но мои усилия были тщетны.

1 ответ

Решение

Запись $(filename) запускает команду "имя файла".

Чтобы раскрыть переменную, используйте ${filename},

Обратите внимание, что если $filename является экспортируемой переменной, под-оболочкой (той, которая запускает -c опция) не увидит значение переменной (из-за одинарных кавычек).

Чтобы это исправить, вам придется использовать двойные кавычки - довольно осторожно:

#!/bin/bash
filename="duck"
sh -c "chromium-browser \"https://duckduckgo.com/?q=%5C$(zenity --entry --text \"I am feeling ducky\" --entry-text ${filename})\""
Другие вопросы по тегам