12

Да, у меня ужасный опыт новичка с Apple Script.

Мне нужно открыть новое окно терминала в текущем пространстве рабочего стола. НЕ перемещайте меня в другое место, где работает Терминал, а затем откройте другое окно Терминала

Конечно, если Терминал не запущен, он должен запустить новый процесс Терминала.

4 ответа4

16
tell application "Terminal"  
    do script " "  
    activate  
end tell

Это кажется странным, но в нем используется странность в том, как Терминал обрабатывает входящие команды "do script"; это создает новое окно для каждого. Вы можете заменить это чем-нибудь полезным, если хотите; он будет выполнять все, что вы хотите, сразу после открытия нового окна.

15

Если у вас нет текста между сценарием do "", вы не получите дополнительную командную строку в терминале.

tell application "Terminal"  
    do script ""  
    activate  
end tell
6

Я могу придумать три разных способа сделать это (первые два украдены откуда-то еще, но я забыл, где). Я использую третий, который вызывает сценарий оболочки из appleScript, потому что я хочу каждый раз открывать новое окно, и потому что оно было самым коротким.

В отличие от скрипта, встроенного в OS X начиная с версии 10.10, все они открывают терминал в любом каталоге, который является текущим рабочим каталогом в вашем окне поиска (т.е. вам не нужно выбирать папку, чтобы открыть ее).

Также имеется пара функций bash для завершения круга Finder> Terminal> Finder.

1. Повторно используйте существующую вкладку или создайте новое окно терминала:

tell application "Finder" to set myDir to POSIX path of (insertion location as alias)
tell application "Terminal"
    if (exists window 1) and not busy of window 1 then
        do script "cd " & quoted form of myDir in window 1
    else
        do script "cd " & quoted form of myDir
    end if
    activate
end tell

2. Повторно используйте существующую вкладку или создайте новую вкладку «Терминал»:

tell application "Finder" to set myDir to POSIX path of (insertion location as alias)
tell application "Terminal"
    if not (exists window 1) then reopen
        activate
    if busy of window 1 then
        tell application "System Events" to keystroke "t" using command down
    end if
    do script "cd " & quoted form of myDir in window 1
end tell

3. Создайте новое окно каждый раз через скрипт оболочки, вызываемый из appleScript.

tell application "Finder"
    set myDir to POSIX path of (insertion location as alias)
    do shell script "open -a \"Terminal\" " & quoted form of myDir
end tell

4. (БОНУС) Bash псевдоним, чтобы открыть новое окно поиска для текущего рабочего каталога в вашем терминале

Добавьте этот псевдоним в ваш .bash_profile.

alias f='open -a Finder ./' 

5. (БОНУС) Измените каталог в окне вашего терминала на путь переднего окна Finder

Добавьте эту функцию в ваш .bash_profile.

cdf() {
      target=`osascript -e 'tell application "Finder" to if (count of Finder windows) > 0 then get POSIX path of (target of front Finder window as text)'`
        if [ "$target" != "" ]; then
            cd "$target"; pwd
        else
            echo 'No Finder window found' >&2
        fi
}
0

Ответы выше работают только если терминал уже запущен. В противном случае он открывает сразу два окна терминала - одно из-за do script и одно из-за activate .

Вы можете предотвратить это с помощью простого if ... else:

if application "Terminal" is running then
    tell application "Terminal"
        do script ""
        activate
    end tell
else
    tell application "Terminal"
        activate
    end tell
end if

Бонус:

Если вы хотите напрямую запускать команды, вы можете сделать это с помощью нажатия клавиш (Не очень элегантно - я знаю! Но это работает)

[...]
else
    tell application "Terminal"
        activate
        tell application "System Events" to keystroke "ls -la" 
        tell application "System Events" to key code 36
    end tell
end if

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .