3

Я использую скрипт, который настраивает виртуальные хосты для меня, а затем открывает URL с помощью safari, однако я пытаюсь изменить скрипт, чтобы он вместо этого открывался в 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/

3 ответа3

5

См. BashFAQ # 50 - нет никакой формы цитирования / экранирования, которую вы можете использовать при установке командной переменной, которая будет работать, потому что после ее использования она разбивается на слова, независимо от того, какие кавычки, экранированные символы и т.д. Могут содержаться , Однако есть несколько способов изменить и определение, и вызов, чтобы он работал (примерно в порядке от большинства к наименее гибким):

Используйте функцию оболочки вместо переменной:

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, но с именем переменной, которое не будет перекрывать PATH):

open_command="open -a"
open_app="/Applications/Google Chrome.app"
$open_command "$open_app" "http://$VIRTUALHOST/"

(обратите внимание, что этот последний не позволит вам вернуться к использованию браузера по умолчанию - нет хорошего способа закрыть приложение.)

2

Это на самом деле немного сложно. Когда вы помещаете свою команду в кавычки, вы уже экранируете специальные символы в этой строке.

Если строка раскрывается, когда вы вызываете переменную в качестве команды, (автоматически) экранированные символы будут освобождены. Это приводит к этому несколько неожиданному поведению, потому что все пробелы в этой строке интерпретируются одинаково, но должны интерпретироваться по-разному.

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

#!/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/
1

Третий должен работать. Если это не так, то это означает, что что-то расширяет строку несколько раз, а это означает, что вам нужно выходить из пробелов несколько раз. Обычная причина этого заключается в том, что где-то в другом месте скрипта ссылается на $ OPEN_COMMAND без заключения в кавычки. Убедитесь, что вы делаете что-то вроде:

fnord="$OPEN_COMMAND"

...и не:

fnord=$OPEN_COMMAND

Другой трюк состоит в том, чтобы изменить место в скрипте, где он пытается запустить $ OPEN_COMMAND:

echo "$OPEN_COMMAND"

... чтобы убедиться, что цитаты сделали это через нетронутыми.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .