передать $@ в AppleScript

Итак, у меня есть следующий скрипт, сохраненный как usr/local/bin/spawn, который открывает процесс в новом окне терминала, а затем закрывает это окно:

#!/bin/sh
osascript <<END
tell app "Terminal" to do script "$1; logout"
END

Так что я могу сделать

$ spawn nano

чтобы открыть новое окно терминала с работающим nano, и когда я закрываю nano, окно также закрывается.

Однако для spawn команды с аргументами, например java -jar foo.jar, мне нужно использовать

$ spawn "java -jar foo.jar"

Есть ли способ изменить скрипт, чтобы он работал без кавычек? Например,

$ spawn java -jar foo.jar

Я попытался использовать трюк из этого ответа на вопрос, не связанный с AppleScript. Однако это всегда приводило к сбою Terminal.app, когда я пытался использовать spawn. Есть ли способ избежать "$@" или другой реализации этой проблемы? Не обязательно использовать AppleScript.


person Fenhl    schedule 19.12.2012    source источник


Ответы (2)


#!/bin/sh
osascript <<END
tell app "Terminal" to do script "$@; logout"
END

кажется, работает для меня.

Другой вариант, который решит вашу проблему, — сохранить код для выполнения в файле во временной папке и открыть его с помощью терминала следующим образом:

#!/bin/sh
file=$(mktemp $TMPDIR/spawnXXXXXX)
echo '#!/bin/sh' > "$file"
echo "$@" >> "$file"
chmod +x "$file"
open -a Terminal "$file"

Или, если вы хотите открыть его в вашей текущей терминальной программе (Терминал, iTerm 2 и т. д.), вы можете использовать этот скрипт:

#!/bin/sh
file=$(mktemp $TMPDIR/spawnXXXXXX.command)
echo '#!/bin/sh' > "$file"
echo "$@" >> "$file"
chmod +x "$file"
open "$file"
person Tyilo    schedule 19.12.2012
comment
Это работает, но не решает проблему побега, о которой говорил Лаури Ранта. - person Fenhl; 20.12.2012
comment
@Fenhl Я не знаю, как это сделать с помощью applescript, но думаю, что решил вашу проблему. - person Tyilo; 20.12.2012

Ваш сценарий также не экранирован должным образом. spawn 'echo "a"' приведет к ошибке из-за двойных кавычек.

Вы можете использовать обработчик запуска для передачи аргументов в osascript:

#!/bin/bash

osascript - "$*" <<END
on run args
tell app "Terminal"
do script item 1 of args
do script "logout" in window 1
end
end
END

"$*" похоже на "$@", но со всеми аргументами в одном слове.

person Lri    schedule 19.12.2012
comment
Этот подход убивает исходное окно терминала в тот момент, когда создается новое. - person Fenhl; 20.12.2012
comment
@Fenhl Что ты имеешь в виду под словом «убить»? В открывшемся окне следует запустить команду logout. Если вы действительно хотите закрыть новое окно, замените do script "logout" in window 1 на close window 1. - person Lri; 20.12.2012
comment
Я имел в виду закрытие, извините. И я мало что знаю об AppleScript, но похоже, что window 1 относится к окну, в котором я вызвал скрипт spawn. - person Fenhl; 24.12.2012