Вопрос: В терминале 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
2017-07-30 23:46


Источник


Эта строка просто устанавливает переменную. Вы должны показать нам, как используется переменная. - Matthew Flaschen
Я отредактировал свой вопрос с этой информацией + ссылку на исходный код. - Seth


Ответы:


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

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

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

#!/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
2017-07-31 00:49



Я пробовал это, но это приводит к ошибкам. Другие команды в скрипте не найдены. Линия PATH = "... является той, которая вызывает их, потому что когда она удаляется, скрипт отлично работает для создания / удаления виртуальных хостов снова - в конце открытия части браузера в конце курса. - Seth
PATH содержит системный путь, что объясняет ошибки при их перезаписывании; выберите другое имя переменной. В общем, вы должны избегать колпачков, кроме переменных, которые вы экспортируете в среду. - Matthew Flaschen
Виноват. Спасибо, что разъяснил Мэтью. Отредактировано, чтобы исправить это. - matthias krull


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

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

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


5
2017-07-31 06:43



отлично поработал, спасибо за сообщение @Gordon - Chris Hough
Это должен быть принятый ответ. - matthias krull


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

fnord="$OPEN_COMMAND"

...и не:

fnord=$OPEN_COMMAND

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

echo "$OPEN_COMMAND"

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


1
2017-07-31 00:06



Я замечаю, что вокруг каких-либо команд нет кавычек. Он отлично работает, если я заменил Google Chrome.app на Firefox.app. Сценарий можно найти здесь: code.google.com/p/virtualhost-sh - Seth