Чи є спосіб відкрити новий термінал з командного рядка та виконати команду на цьому новому терміналі (на Mac)?
наприклад, щось на кшталт:
Terminal -e ls
де ls
запускається в новому терміналі.
Чи є спосіб відкрити новий термінал з командного рядка та виконати команду на цьому новому терміналі (на Mac)?
наприклад, щось на кшталт:
Terminal -e ls
де ls
запускається в новому терміналі.
Відповіді:
osascript -e 'tell app "Terminal"
do script "echo hello"
end tell'
Це відкриває новий термінал і виконує команду "echo hello" всередині нього.
osascript -e 'tell app "Terminal" to do script "echo hello"'
"$@"
оболонки, але в сценарії osa?
Ви можете це зробити круговим способом:
% cat /tmp/hello.command
#! /bin/sh -
say hello
% chmod +x /tmp/hello.command
% open /tmp/hello.command
Сценарії оболонки, які мають розширення .command
та які виконують, можна двічі клацнути, щоб запустити всередину нового вікна терміналу. Команда open
, як ви, напевно, знаєте, еквівалентна подвійному клацанню на об'єкт Finder, тому ця процедура закінчується запуском команд у скрипті в новому вікні терміналу.
Трохи скручений, але, здається, працює. Я впевнений, що до цього повинен бути прямий шлях (що ти насправді намагаєшся зробити?), Але це мені зараз уникає.
#!/usr/bin/env ruby1.9
require 'shellwords'
require 'appscript'
class Terminal
include Appscript
attr_reader :terminal, :current_window
def initialize
@terminal = app('Terminal')
@current_window = terminal.windows.first
yield self
end
def tab(dir, command = nil)
app('System Events').application_processes['Terminal.app'].keystroke('t', :using => :command_down)
cd_and_run dir, command
end
def cd_and_run(dir, command = nil)
run "clear; cd #{dir.shellescape}"
run command
end
def run(command)
command = command.shelljoin if command.is_a?(Array)
if command && !command.empty?
terminal.do_script(command, :in => current_window.tabs.last)
end
end
end
Terminal.new do |t|
t.tab Dir.pwd, ARGV.length == 1 ? ARGV.first : ARGV
end
Вам потрібен рубін 1.9, або вам потрібно буде додати рядок require 'rubygems'
до того, як вимагають інші, і не забудьте встановити gem rb-appscript
.
Я назвав цей скрипт dt
(вкладка dup), тому я можу просто запустити, dt
щоб відкрити вкладку в тій же папці або dt ls
також запустити ls
команду там .
Це працює, принаймні під гірським левом. Він ініціалізує інтерактивну оболонку кожен раз, хоча ви можете замінити цей факт після виходу, посилаючись на нього як "macterm exec your-command ". Зберігайте це у bin / macterm у своєму домашньому каталозі та chmod a + x bin / macterm:
#!/usr/bin/osascript
on run argv
tell app "Terminal"
set AppleScript's text item delimiters to " "
do script argv as string
end tell
end run
Я б зробив це з AppleScript. Ви можете впорядкувати його за допомогою команди osascript. Ваш сценарій буде приблизно таким:
tell application "Terminal"
activate
tell application "System Events"
keystroke "t" using {command down}
end tell
end tell
Якщо ви збираєтесь отримувати доступ до нього лише в терміналі, тоді ви можете опустити все, окрім середньої заяви. Якщо ви хочете нове вікно замість нової вкладки, замініть клавішу t на n.
Я недостатньо досвідчений AppleScripter, щоб знати, як отримати аргументи командного рядка, а потім повторно ввести їх у новому вікні, але я впевнений, що це можливо і не надто складно.
Крім того, я думаю, що це працює, і я не в змозі перевірити зараз, але я впевнений, що ви можете запустити скрипт оболонки з деяким варіантом на #! / Usr / bin / osascript -e, а потім зберегти його як виконуваний файл проте ви хочете. Що, принаймні, в моїй голові, дозволило б вам набрати щось на зразок $ runinnewterm ls / Applications