Существует сценарий, который я использую, который настраивает виртуальные хосты ко мне и затем открывает URL с помощью сафари, однако, я пытаюсь изменить сценарий, таким образом, это открывается в Google Chrome вместо этого.
Эта строка дает мне проблемы.
OPEN_COMMAND="/usr/bin/open -a /Applications/Google Chrome.app"
Я также попробовал...
OPEN_COMMAND="/usr/bin/open -a /Applications/Google\ Chrome.app"
.. и...
OPEN_COMMAND="/usr/bin/open -a /Applications/'Google Chrome.app'"
Ошибка говорит, что файл не существует.
Это - то, где команда используется в нижней части сценария...
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Launch the new URL in the browser
#
/bin/echo -n "Launching virtualhost... "
$OPEN_COMMAND http://$VIRTUALHOST/
/bin/echo "done"
Сценарий размещается здесь: http://code.google.com/p/virtualhost-sh/
Это на самом деле немного хитро. При помещении команды в кавычки, Вы уже выходите из специальных символов в той строке.
Если строка расширена при вызове переменной как команды, (автоматически) завершенные символы становятся незавершенными. Это приводит к этому несколько неожиданному поведению, потому что все пробелы в той строке интерпретируются тот же путь, но должны быть интерпретированы по-другому.
Это может быть achived путем помещения команды и filepath в отдельные переменные и только заключить часть в кавычки, где необходимо выйти из пробелов:
#!/bin/bash
COMMAND="open -a"
APPPATH="/Applications/Google Chrome.app"
$COMMAND "$APPPATH"
Для Вашего редактирования:
OPEN_COMMAND="/usr/bin/open -a"
APPPATH="/Applications/Google Chrome.app"
...
$OPEN_COMMAND "$APPPATH" http://$VIRTUALHOST/
Посмотрите BashFAQ № 50 - нет никакой формы заключения в кавычки/выхода, можно сделать при установке переменной команды, это будет работать, потому что после того, как это использовало его, ворван слова без любого отношения к тому, какие кавычки, Escape, и т.д. это, может оказаться, содержит. Существуют, однако, несколько способов изменить и определение и вызов, чтобы заставить его работать (примерно в порядке от большинства до наименее гибкого):
Используйте функцию оболочки, а не переменную:
open_command() { open -a "/Applications/Google Chrome.app" "$@"; }
open_command "http://$VIRTUALHOST/"
Используйте массив, а не простую переменную:
open_command=( open -a "/Applications/Google Chrome.app" )
"${open_command[@]}" "http://$VIRTUALHOST/"
Используйте отдельные переменные (как то, что mugen kenichi предложил, но с именем переменной, которое не ударит ПУТЬ):
open_command="open -a"
open_app="/Applications/Google Chrome.app"
$open_command "$open_app" "http://$VIRTUALHOST/"
(обратите внимание, что этот последний не позволит Вам отступить к использованию браузера по умолчанию - нет никакого хорошего способа бросить приложение.)
Третий должен работать. Если это не, то это означает, что что-то разворачивает строку многократно, что означает, что необходимо выйти из пробелов многократно. Обычная причина этого состоит в том, который где-нибудь в другом месте в сценарии относится к $OPEN_COMMAND, не помещая кавычки вокруг него. Удостоверьтесь выполнение материала как:
fnord="$OPEN_COMMAND"
... и нет:
fnord=$OPEN_COMMAND
Другой прием должен изменить место в сценарии, где это пытается выполнить $OPEN_COMMAND к:
echo "$OPEN_COMMAND"
... для обеспечения кавычек удались неповрежденные.