Выполнение команды в новом окне Mac OS X Terminal - PullRequest
81 голосов
/ 13 июня 2009

Я пытался выяснить, как запустить команду bash в новом окне Max OS X Terminal.app. Как пример, вот как я должен выполнить свою команду в новом процессе bash:

bash -c "my command here"

Но это повторно использует существующее окно терминала, а не создает новое. Я хочу что-то вроде:

Terminal.app -c "my command here"

Но, конечно, это не работает. Мне известна команда «open -a Terminal.app», но я не вижу, как пересылать аргументы на терминал, или даже если я сделал какие аргументы использовать.

Ответы [ 9 ]

77 голосов
/ 13 июня 2009

Один из способов, которым я могу воспользоваться, - создать файл .command и запустить его так:

echo echo hello > sayhi.command; chmod +x sayhi.command; open sayhi.command

или используйте appleScript:

osascript -e 'tell application "Terminal" to do script "echo hello"'

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

64 голосов
/ 13 июня 2009

Частичное решение:

Поместите то, что вы хотите сделать, в shell-скрипт, например так:

#!/bin/bash
ls
echo "yey!"

И не забывайте 'chmod +x file', чтобы сделать его исполняемым. Тогда вы можете

open -a Terminal.app scriptfile

и он запустится в новом окне. Добавьте 'bash' в конце скрипта, чтобы не завершить новый сеанс. (Хотя вам, возможно, придется выяснить, как загружать пользовательские rc-файлы и прочее ..)

31 голосов
/ 21 мая 2010

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

#!/bin/sh 
osascript <<END 
tell application "Terminal"
    do script "cd \"`pwd`\";$1;exit"
end tell
END
8 голосов
/ 23 октября 2010

Если кому-то все равно, вот эквивалент для iTerm:

#!/bin/sh
osascript <<END
tell application "iTerm"
 tell the first terminal
  launch session "Default Session"
  tell the last session
   write text "cd \"`pwd`\";$1;exit"
  end tell
 end tell
end tell
END
3 голосов
/ 21 апреля 2015

Я сделал функциональную версию ответа Оскара, он также копирует среду и вносит изменения в соответствующий каталог

function new_window {
    TMP_FILE=$(mktemp "/tmp/command.XXXXXX")
    echo "#!/usr/bin/env bash" > $TMP_FILE

    # Copy over environment (including functions), but filter out readonly stuff
    set | grep -v "\(BASH_VERSINFO\|EUID\|PPID\|SHELLOPTS\|UID\)" >> $TMP_FILE

    # Copy over exported envrionment
    export -p >> $TMP_FILE

    # Change to directory
    echo "cd $(pwd)" >> $TMP_FILE

    # Copy over target command line
    echo "$@" >> $TMP_FILE

    chmod +x "$TMP_FILE"
    open -b com.apple.terminal "$TMP_FILE"

    sleep .1 # Wait for terminal to start
    rm "$TMP_FILE"
}

Вы можете использовать это так:

new_window my command here

или

new_window ssh example.com
2 голосов
/ 08 мая 2012

Вот мой потрясающий скрипт, он создает новое окно терминала при необходимости и переключается в каталог, в котором находится Finder, если Finder находится впереди. В нем есть все необходимое оборудование для запуска команд.

on run
    -- Figure out if we want to do the cd (doIt)
    -- Figure out what the path is and quote it (myPath)
    try
        tell application "Finder" to set doIt to frontmost
        set myPath to finder_path()
        if myPath is equal to "" then
            set doIt to false
        else
            set myPath to quote_for_bash(myPath)
        end if
    on error
        set doIt to false
    end try

    -- Figure out if we need to open a window
    -- If Terminal was not running, one will be opened automatically
    tell application "System Events" to set isRunning to (exists process "Terminal")

    tell application "Terminal"
        -- Open a new window
        if isRunning then do script ""
        activate
        -- cd to the path
        if doIt then
            -- We need to delay, terminal ignores the second do script otherwise
            delay 0.3
            do script " cd " & myPath in front window
        end if
    end tell
end run

on finder_path()
    try
        tell application "Finder" to set the source_folder to (folder of the front window) as alias
        set thePath to (POSIX path of the source_folder as string)
    on error -- no open folder windows
        set thePath to ""
    end try

    return thePath
end finder_path

-- This simply quotes all occurrences of ' and puts the whole thing between 's
on quote_for_bash(theString)
    set oldDelims to AppleScript's text item delimiters
    set AppleScript's text item delimiters to "'"
    set the parsedList to every text item of theString
    set AppleScript's text item delimiters to "'\\''"
    set theString to the parsedList as string
    set AppleScript's text item delimiters to oldDelims
    return "'" & theString & "'"
end quote_for_bash
2 голосов
/ 14 июня 2009

Вот еще один пример (также с использованием AppleScript):

function newincmd() { 
   declare args 
   # escape single & double quotes 
   args="${@//\'/\'}" 
   args="${args//\"/\\\"}" 
   printf "%s" "${args}" | /usr/bin/pbcopy 
   #printf "%q" "${args}" | /usr/bin/pbcopy 
   /usr/bin/open -a Terminal 
   /usr/bin/osascript -e 'tell application "Terminal" to do script with command "/usr/bin/clear; eval \"$(/usr/bin/pbpaste)\""' 
   return 0 
} 

newincmd ls 

newincmd echo "hello \" world" 
newincmd echo $'hello \' world' 

см. Codesnippets.joyent.com/posts/show/1516

0 голосов
/ 03 июня 2017

Я называю этот сценарий транком. Я предлагаю поместить его в каталог по вашему пути к исполняемому файлу. Убедитесь, что он исполняется так:

chmod +x ~/bin/trun

Затем вы можете запускать команды в новом окне, просто добавив перед ними trun, например:

trun tail -f /var/log/system.log

Вот сценарий. Он делает некоторые причудливые вещи, такие как передача аргументов, изменение строки заголовка, очистка экрана, чтобы удалить беспорядок запуска оболочки, удаление его файла, когда он будет сделан. Используя уникальный файл для каждого нового окна, его можно использовать для одновременного создания множества окон.

#!/bin/bash
# make this file executable with chmod +x trun
# create a unique file in /tmp
trun_cmd=`mktemp`
# make it cd back to where we are now
echo "cd `pwd`" >$trun_cmd
# make the title bar contain the command being run
echo 'echo -n -e "\033]0;'$*'\007"' >>$trun_cmd
# clear window
echo clear >>$trun_cmd
# the shell command to execute
echo $* >>$trun_cmd
# make the command remove itself
echo rm $trun_cmd >>$trun_cmd
# make the file executable
chmod +x $trun_cmd

# open it in Terminal to run it in a new Terminal window
open -b com.apple.terminal $trun_cmd
0 голосов
/ 14 июня 2009

Вы также можете вызвать функцию новая команда терминала, нажав комбинацию клавиш Shift + ⌘ + N. Команда, введенная вами в поле, будет запущена в новом окне терминала.

...