Выполнение команды в новом окне терминала Mac OS X
Я пытался выяснить, как запустить команду bash в новом терминале Max OS X.окно приложения. В качестве примера, вот как я бы запустил свою команду в новом процессе bash:
bash -c "my command here"
но это повторно использует существующее окно терминала вместо создания нового. Я хочу что-то вроде:
Terminal.app -c "my command here"
но конечно это не работает. Я знаю о "открытом терминале".app " команда, но я не вижу, как пересылать аргументы в терминал, или даже если я сделал то, что аргументы для использования.
спасибо!
9 ответов:
один способ я могу думать, чтобы сделать это с верхней части моей головы, чтобы создать .командный файл и запустить его так:
echo echo hello > sayhi.command; chmod +x sayhi.command; open sayhi.command
или использовать applescript:
osascript -e 'tell application "Terminal" to do script "echo hello"'
хотя вам придется либо избегать много двойных кавычек, либо не иметь возможности использовать одинарные кавычки
частичное решение:
поместите то, что вы хотите сделать в shell-script, например, так
#!/bin/bash ls echo "yey!"
и не забудьте '
chmod +x file
', чтобы сделать его исполняемым. Тогда вы можетеopen -a Terminal.app scriptfile
и он будет работать в новом окне. Добавить'
bash
В конце скрипта, чтобы сохранить новую сессию от выхода. (Хотя вам, возможно, придется выяснить, как загружать rc-файлы пользователей и прочее..)
Я пытался сделать это в течение некоторого времени. Вот сценарий, который изменяется в тот же рабочий каталог, запускает команду и закрывает окно терминала.
#!/bin/sh osascript <<END tell application "Terminal" do script "cd \"`pwd`\";;exit" end tell END
в случае, если кто-то заботится, вот эквивалент на iTerm:
#!/bin/sh osascript <<END tell application "iTerm" tell the first terminal launch session "Default Session" tell the last session write text "cd \"`pwd`\";;exit" end tell end tell end tell END
вот еще один взгляд на это (также с помощью 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
вот мой удивительный скрипт, он создает новое окно терминала, если это необходимо, и переключается на поиск каталога, если 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
Я сделал функциональную версию ответа Оскара, это также копирует среду и изменения в соответствующий каталог
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
вы также можете вызвать новая команда особенность терминала путем отжимать
Shift + ⌘ + N
сочетания клавиш. Команда, введенная в поле, будет запущена в новом окне терминала.
Я называю этот скрипт trun. Я предлагаю поместить его в каталог в вашем исполняемом пути. Убедитесь, что он исполняется следующим образом:
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 "3]0;'$*'7"' >>$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