2013-06-06 12 views
8

Próbuję uruchomić ten skrypt. Jest to skrypt o nazwie Bash, który ma zająć pewne zmienne, połączyć je i użyć wyniku do wysłania polecenia AppleScript. Ręczne wklejenie ciągu znaków odczytywanego ze zmiennej to_osa za terminalem działa tak jak chcę i oczekuję tego. Ale kiedy próbuję połączyć polecenie osascript -e i ciąg to_osa, to nie działa. Jak mogę to sprawić?Łączenie zmiennych w Bash w celu utworzenia polecenia wysyłanego do AppleScript za pomocą komendy osascript

the_url="\"http://stackoverflow.com/questions/1521462/looping-through-the-content-of-a-file-in-bash\"" 
the_script='tell application "Safari" to set the URL of the front document to ' 
delimiter="'" 
to_osa=${delimiter}${the_script}${the_url}${delimiter} 
echo ${to_osa} 
osascript -e ${to_osa} 

Oprócz pracy ręcznie skrypt działa także wtedy, gdy piszę żądane polecenie do skryptu, a następnie uruchomić go:

echo "osascript -e" $to_osa > ~/Desktop/outputfile.sh 
sh ~/Desktop/outputfile.sh 

Odpowiedz

2

Zgodnie z ogólną zasadą, nie należy umieszczać w cudzysłów zmienną, umieść je wokół zmiennej o numerze. W tym przypadku jest to bardziej skomplikowane, ponieważ masz kilka podwójnych cytatów na cytowanie na poziomie bash, a niektóre na cytowanie na poziomie AppleScript; w tym przypadku, cytaty AppleScript szczebla iść w zmiennej, cytaty bash szczebla obejść zmiennej:

the_url="\"http://stackoverflow.com/questions/1521462/looping-through-the-content-of-a-file-in-bash\"" 
the_script='tell application "Safari" to set the URL of the front document to ' 
osascript -e "${the_script}${the_url}" 

BTW, używając echo sprawdzić takie rzeczy jak to jest bardzo mylące. echo mówi ci, co jest w zmiennej, a nie co będzie wykonane, gdy odniesiesz się do zmiennej w linii poleceń. Największą różnicą jest to, że echo wypisuje swoje argumenty: po przeszły one przez parsowanie basha (wycinanie i usuwanie escape, itp.), Ale kiedy mówisz "Ręcznie wklejasz ciąg ... działa" mówisz, że to jest to czego chcesz przed analizą. Jeśli cytaty są w cytowanym ciągu, oznacza to, że bash nie rozpoznał ich jako cytatów i nie usunął ich. Porównaj:

string='"quoted string"' 
echo $string   # prints the string with double-quotes around it because bash doesnt't recognize them in a variable 
echo "quoted string" # prints *without* quotes because bash recognizes and removes them 
11

String zacierania kod wykonywalny jest podatny na błędy i zło, i nie ma absolutnie żadnej potrzeby tutaj. To trywialne przekazywać argumenty do AppleScript definiując wyraźny „Uruchom” Handler:

on run argv -- argv is a list of strings 
    -- do stuff here 
end run 

które następnie powołać się tak:

osascript -e /path/to/script arg1 arg2 ... 

BTW, jeśli skrypt wymaga określonej liczby args, można również napisać to tak:

on run {arg1, arg2, ...} -- each arg is a string 
    -- do stuff here 
end run 

...

Idąc dalej, można nawet zrobić Apple Skrypt bezpośrednio wykonywalny, tak jak każdy inny skrypt powłoki. Po pierwsze, dodać hashbang następująco:

#!/usr/bin/osascript 

on run argv 
    -- do stuff here 
end run 

następnie zapisać go w zwykłym formacie tekstowym nieskompilowanego i uruchomić chmod +x /path/to/myscript aby plik wykonywalny. Następnie można wykonać go z powłoki, co następuje:

/path/to/myscript arg1 arg2 ... 

Lub, jeśli nie chcesz, aby podać pełną ścieżkę za każdym razem, umieścić plik w /usr/local/bin lub innego katalogu, który znajduje się na ścieżce swojej powłoki:

myscript arg1 arg2 ... 

...

Więc oto jak należy pisać oryginalny scenariusz:

#!/bin/sh 
the_url="http://stackoverflow.com/questions/1521462/looping-through-the-content-of-a-file-in-bash" 
osascript -e 'on run {theURL}' -e 'tell application "Safari" to set URL of document 1 to theURL' -e 'end run' $the_url 

Szybkie, proste i bardzo wytrzymałe.

-

PS: Jeśli wolisz otworzyć URL w nowym oknie niż w istniejącym, zobacz stronę podręcznika dla narzędzia OS X: open.

+0

dlaczego the_url ma wartośćURL? –

+1

Przyzwyczajenie; nazwij to, co chcesz. – foo

+1

A jeśli chcemy, aby Apple srcipt robił skrypt powłoki, który zależy od zmiennych? Na przykład. osascript -e 'wykonaj skrypt powłoki \ "echo $ the_url \"'. – lef

Powiązane problemy