Как исправить «синтаксическую ошибку: неизвестный токен не может зайти сюда» при запуске exec.Command в скрипте Go - PullRequest
0 голосов
/ 17 апреля 2019

Я пытаюсь запустить эту команду Apple Script с osascript в моем скрипте Go, и я получаю ошибку 0:1: syntax error: A unknown token can’t go here. (-2740).

Эта команда прекрасно работает при запуске в Терминале!

/usr/bin/osascript -e 'on run {f, c}' -e 'tell app "Finder" to set comment of (POSIX file f as alias) to c' -e end "/Users/computerman/Desktop/testfile.png" "Hello, World"

Мой скрипт Go на самом деле выводит приведенную выше строку, и я могу буквально вырезать и вставить ее в Terminal, и она работает.Однако, запуская сам скрипт Go, я получаю вышеупомянутую ошибку.

Пожалуйста, помогите!

Это на MacOS 10.14.4 (18E2034).Я попытался заменить fmt.Sprintf более простой строкой на \ "Finder \", и у меня возникла та же проблема.


import (
    "fmt"
    "log"
    "os"
    "os/exec"
)

func main() {
    filepath := "/Users/computerman/Desktop/testfile.png"
    comment := "Hello, World"
    onrun := "'on run {f, c}'"
    command := fmt.Sprintf(`'tell app "Finder" to set comment of (POSIX file f as alias) to c' -e end "%s" "%s"`, filepath, comment)
    log.Println("/usr/bin/osascript", "-e", onrun, "-e", command)
    cmd := exec.Command("/usr/bin/osascript", "-e", onrun, "-e", command)
    cmd.Stderr = os.Stderr
    cmd.Stdout = os.Stdout
    cmd.Stdin = os.Stdin

    err := cmd.Run()
    if err != nil {
        log.Println(err)
    }
}

Когда я делаю go run main.go, я получаю это в Терминале

2019/04/17 13:02:28 exit status 1

Я ожидаю вывод

Hello, World

И никаких ошибок.Кроме того, поле комментария в файле будет обновлено с помощью Hello, World.

Ответы [ 2 ]

1 голос
/ 18 апреля 2019

Благодаря предыдущим комментариям я обнаружил ответ. Вот правильный код, который работает. Спасибо Адриану за то, что он указал, что вам не нужны одинарные кавычки, поэтому я удалил их, и спасибо Нику за то, что он указал, что конечный флаг должен быть отделен от этой строки.

func main() {
    filepath := "/Users/computerman/Desktop/testfile.png"
    comment := "Hello, World"
    onrun := "on run {f, c}"
    command := fmt.Sprintf(`tell app "Finder" to set comment of (POSIX file f as alias) to c`)
    //log.Println("/usr/bin/osascript", "-e", onrun, "-e", command)
    cmd := exec.Command("/usr/bin/osascript", "-e", onrun, "-e", command, "-e", "end", filepath, comment)
    cmd.Stderr = os.Stderr
    cmd.Stdout = os.Stdout
    cmd.Stdin = os.Stdin

    err := cmd.Run()
    if err != nil {
        log.Println(err)
    }
}

Работает!

0 голосов
/ 17 апреля 2019

Вам также нужно выделить -e в конце command и комментарий, что-то вроде этого.Надеемся, что это то же число параметров, что и в исходной команде.

func main() {
    filepath := "/Users/computerman/Desktop/testfile.png"
    comment := "Hello, World"
    onrun := "'on run {f, c}'"
    command := fmt.Sprintf(`'tell app "Finder" to set comment of (POSIX file f as alias) to c'`)
    end := fmt.Sprintf(`end "%s")`, filepath)
    log.Println("/usr/bin/osascript", "-e", onrun, "-e", command, "-e", end, comment)
    cmd := exec.Command("/usr/bin/osascript", "-e", onrun, "-e", command, "-e", end, comment)
    cmd.Stderr = os.Stderr
    cmd.Stdout = os.Stdout
    cmd.Stdin = os.Stdin

    err := cmd.Run()
    if err != nil {
        log.Println(err)
    }
}
...