В Терминале OSX, как я открываю файл с пространством в, он - имя?

Существует сценарий, который я использую, который настраивает виртуальные хосты ко мне и затем открывает 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/

3
задан 28.09.2014, 17:46

3 ответа

Это на самом деле немного хитро. При помещении команды в кавычки, Вы уже выходите из специальных символов в той строке.

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

Это может быть 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/
2
ответ дан 07.12.2019, 23:17

Посмотрите 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/"

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

5
ответ дан 07.12.2019, 23:17

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

fnord="$OPEN_COMMAND"

... и нет:

fnord=$OPEN_COMMAND

Другой прием должен изменить место в сценарии, где это пытается выполнить $OPEN_COMMAND к:

echo "$OPEN_COMMAND"

... для обеспечения кавычек удались неповрежденные.

1
ответ дан 07.12.2019, 23:17

Теги

Похожие вопросы