No Terminal OSX, como abro um arquivo com um espaço em seu nome?

3

Existe um script que eu uso que configura hosts virtuais para mim e, em seguida, abre a URL usando o safari. No entanto, estou tentando alterar o script para que ele seja aberto no Google Chrome.

Esta linha está me dando problemas.

OPEN_COMMAND="/usr/bin/open -a /Applications/Google Chrome.app"

Eu também tentei ...

OPEN_COMMAND="/usr/bin/open -a /Applications/Google\ Chrome.app"

.. e ...

OPEN_COMMAND="/usr/bin/open -a /Applications/'Google Chrome.app'"

O erro indica que o arquivo não existe.

Aqui é onde o comando é usado na parte inferior do script ...

# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Launch the new URL in the browser
#
/bin/echo -n "Launching virtualhost... "
$OPEN_COMMAND http://$VIRTUALHOST/
/bin/echo "done"

O script está hospedado aqui: link

    
por Seth 31.07.2010 / 01:46

3 respostas

2

Isso é realmente um pouco complicado. Quando você coloca seu comando entre aspas, você já escapa dos caracteres especiais da string.

Se a cadeia de caracteres for expandida quando você invocar a variável como comando, os caracteres de escape (automaticamente) escapados serão removidos do escape. Isso leva a esse comportamento inesperado porque todos os espaços em branco nessa sequência são interpretados da mesma maneira, mas devem ser interpretados de maneira diferente.

Isso pode ser conseguido colocando-se o comando e o caminho de arquivo em variáveis separadas e apenas a parte em que você tem que escapar dos espaços em branco:

#!/bin/bash

COMMAND="open -a"
APPPATH="/Applications/Google Chrome.app"

$COMMAND "$APPPATH"

Para sua edição:

OPEN_COMMAND="/usr/bin/open -a"
APPPATH="/Applications/Google Chrome.app"
...
$OPEN_COMMAND "$APPPATH" http://$VIRTUALHOST/
    
por 31.07.2010 / 02:49
5

Veja BashFAQ # 50 - não há nenhuma forma de citar / escapar que você possa fazer ao definir a variável de comando que ' Tudo vai funcionar, porque depois de usado é quebrado em palavras sem qualquer consideração sobre o que cita, escapa, etc pode acontecer de conter. Existem, no entanto, algumas maneiras de alterar a definição e a invocação para que ela funcione (aproximadamente da ordem para a menos flexível):

Use uma função shell em vez de uma variável:

open_command() { open -a "/Applications/Google Chrome.app" "$@"; }
open_command "http://$VIRTUALHOST/"

Use uma matriz em vez de uma variável simples:

open_command=( open -a "/Applications/Google Chrome.app" )
"${open_command[@]}" "http://$VIRTUALHOST/"

Use variáveis separadas (como o que o Mugen Kenichi sugeriu, mas com um nome de variável que não vai atrapalhar o PATH):

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

(note que este último não vai deixar você voltar a usar o navegador padrão - não há uma boa maneira de deixar o aplicativo.)

    
por 31.07.2010 / 08:43
1

O terceiro deve funcionar. Se não for, então isso significa que algo está expandindo a string várias vezes, o que significa que você precisa escapar dos espaços várias vezes. A causa usual disso é que em algum lugar em outro lugar do script está se referindo a $ OPEN_COMMAND sem colocar aspas em volta dele. Certifique-se de que você está fazendo coisas como:

fnord="$OPEN_COMMAND"

... e não:

fnord=$OPEN_COMMAND

O outro truque é mudar o lugar no script em que ele está tentando executar $ OPEN_COMMAND para:

echo "$OPEN_COMMAND"

... para garantir que as cotações tenham passado intacta.

    
por 31.07.2010 / 02:06