Как правильно передать вложенные списки из Applescript в Bash - PullRequest
0 голосов
/ 08 ноября 2019

Я работаю над проектом, который включает использование Applescript для создания списка открытых URL-адресов в браузере Google Chrome пользователей, чтобы сохранить их на случай, когда я в конечном итоге захочу снова открыть Chrome. Обнаружив, что мне нужен способ определить, какие вкладки присутствуют в каких окнах, я решил попытаться создать вложенный список в Applescript, в котором каждое окно является собственным подсписком URL-адресов вкладок, а затем вернуть его в объявленной переменной. до подоболочки.

Я делаю это с помощью следующего кода

tabs=$(/usr/bin/osascript << EOT
    tell application "Google Chrome"
        # save a variable to the number of windows open     
        set windowCount to number of windows        
        set myWindows to {}

        repeat with x from 1 to windowCount     
            # count the tabs in the window we are iterated upon     
            set tabcount to number of tabs in window x

            # this list will hold the URLs, delimited by commas         
            set myURLs to {}

            # secondary loop, this time iterating tabs
            repeat with y from 1 to tabcount            
                # grab URL from current tab
                set tabURL to URL of tab y of window x

                # append URL to end of list         
                copy tabURL to the end of myURLs
            end repeat

            # this means our end result will be a list of lists
            # containing the URLs of all the tabs of all the windows
            copy myURLs to the end of myWindows             
        end repeat

        return myWindows
    end tell
    EOT)

Проблема, с которой я сталкиваюсь, заключается в том, что, хотя Applescript правильно создает вложенный список, то есть

{{"https://stackoverflow.com/questions/ask"}, {"https://twitter.com", "https://facebook.com"}}

Кажется, что Bash сглаживает список, когда я ссылаюсь $tabs позже, на что-то вроде

https://stackoverflow.com/questions/ask, https://twitter.com, https://facebook.com

, что заставляет меня поверить в Applescript иBash не ладит при передаче сложных переменных. Так ли это, и не может ли Bash читать многомерные списки из Applescript? Или я просто неправильно программирую это?

Спасибо!

1 Ответ

0 голосов
/ 16 ноября 2019

Вот простой базовый скрипт, который содержит два обработчика: storeURLs() и restoreURLs().

storeURLs() извлекает вложенный список открытых в настоящее время вкладок Chrome (сгруппированных по окнам) и записывает их URL-адреса. в файл. restoreURLs() читает этот файл и открывает URL-адреса в Chrome, восстанавливая расположение вкладок и окон.

Запуск сценария в его текущей форме сохранит список URL-адресов в файле ~/.chrometabs. Чтобы получить сценарий для восстановления сохраненных URL-адресов, закомментируйте первое вхождение "storeURLs()" (строка 6), добавив к нему два дефиса (--) или хеш (#);и раскомментируйте строку ниже, удалив два дефиса перед "restoreURLs()".

property home : system attribute "HOME"
property file : home & "/.chrometabs" --> /Users/%YOU%/.chrometabs


on run
    storeURLs()
    --restoreURLs()
end run

on storeURLs()
    close access (open for access my file)

    tell application id "com.google.chrome" to set ¬
        URLs to the URL of every tab in every window

    write the URLs to my file
    return the URLs
end storeURLs

to restoreURLs()
    close access (open for access my file)
    if (get eof of my file) = 0 then return false
    set URLs to read my file as list

    tell application id "com.google.chrome"
        repeat with URLgroup in the reverse of URLs
            tell (make new window)
                set the active tab's URL to the URLgroup's 1st item
                repeat with |URL| in the rest of the URLgroup
                    make new tab with properties {URL:|URL|}
                end repeat
            end tell
        end repeat

        activate
    end tell

    return the URLs
end restoreURLs

Скрипт не содержит ничего, кроме самого простого предотвращения ошибок, и, как таковой, будетизвлечь выгоду из дополнительной обработки ошибок. Он был написан и протестирован с использованием AppleScript версии 2.5 в macOS 10.12.6 . Единственной потенциальной проблемой, которую я ожидаю в более поздних версиях macOS (Mojave, Catalina), будут блокад безопасности, которые могут помешать созданию сценария и / или записи в путь к файлу ~/.chrometabs, либо из-за его расположения, либо из-за ведущей"." в имени файла, которое обозначает невидимый файл в macOS.

...