Чи є спосіб відкрити новий термінал з командного рядка та виконати команду на цьому новому терміналі (на 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