Có cách nào để mở một thiết bị đầu cuối mới từ dòng lệnh và chạy một lệnh trên thiết bị đầu cuối mới đó (trên máy Mac) không?
ví dụ: Một cái gì đó như:
Terminal -e ls
nơi ls
được chạy trong thiết bị đầu cuối mới.
Có cách nào để mở một thiết bị đầu cuối mới từ dòng lệnh và chạy một lệnh trên thiết bị đầu cuối mới đó (trên máy Mac) không?
ví dụ: Một cái gì đó như:
Terminal -e ls
nơi ls
được chạy trong thiết bị đầu cuối mới.
Câu trả lời:
osascript -e 'tell app "Terminal"
do script "echo hello"
end tell'
Điều này sẽ mở ra một thiết bị đầu cuối mới và thực hiện lệnh "echo hello" bên trong nó.
osascript -e 'tell app "Terminal" to do script "echo hello"'
"$@"
trong shell nhưng trong tập lệnh osa?
Bạn có thể làm điều đó theo cách vòng vo:
% cat /tmp/hello.command
#! /bin/sh -
say hello
% chmod +x /tmp/hello.command
% open /tmp/hello.command
Các tập lệnh Shell có phần mở rộng .command
và có thể thực thi được, có thể nhấp đúp vào để chạy bên trong cửa sổ Terminal mới. Lệnh open
, như bạn có thể biết, tương đương với nhấp đúp vào đối tượng Finder, vì vậy quy trình này kết thúc bằng cách chạy các lệnh trong tập lệnh trong cửa sổ Terminal mới.
Hơi xoắn, nhưng nó có vẻ hoạt động. Tôi cảm thấy chắc chắn phải có một con đường trực tiếp hơn đến đây (bạn thực sự đang cố gắng làm gì?), Nhưng nó thoát khỏi tôi ngay bây giờ.
#!/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
Bạn cần ruby 1.9 hoặc bạn sẽ cần thêm dòng require 'rubygems'
trước khi người khác yêu cầu và đừng quên cài đặt gem rb-appscript
.
Tôi đặt tên cho tập lệnh này dt
(tab kép), vì vậy tôi chỉ có thể chạy dt
để mở tab trong cùng thư mục hoặc dt ls
chạy ls
lệnh đó .
Điều này hoạt động, ít nhất là dưới Mountain Lion. Nó sẽ khởi tạo một lớp vỏ tương tác mỗi lần, mặc dù bạn có thể thay thế nó sau khi thực tế bằng cách gọi nó là "vi khuẩn thực thi lệnh của bạn ". Lưu trữ này trong bin / macterm trong thư mục nhà của bạn và 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
Tôi sẽ làm điều này với AppleScript. Bạn có thể hợp lý hóa nó bằng cách sử dụng lệnh osascript. Kịch bản của bạn sẽ giống như:
tell application "Terminal"
activate
tell application "System Events"
keystroke "t" using {command down}
end tell
end tell
Nếu bạn chỉ truy cập nó trong thiết bị đầu cuối, thì bạn có thể bỏ qua tất cả trừ câu lệnh trung gian. Nếu bạn muốn có một cửa sổ mới thay vì một tab mới, hãy thay thế tổ hợp phím t bằng n.
Tôi không phải là một AppleScripter đủ kinh nghiệm để biết cách lấy các đối số dòng lệnh và sau đó nhập lại chúng trong cửa sổ mới, nhưng tôi chắc chắn rằng điều đó là có thể và không quá khó.
Ngoài ra, tôi nghĩ rằng điều này hoạt động và tôi không thể kiểm tra ngay bây giờ, nhưng tôi khá chắc chắn rằng bạn có thể bắt đầu một tập lệnh shell với một số biến thể trên #! / Usr / bin / osascript -e và sau đó lưu nó dưới dạng thực thi tuy nhiên bạn muốn Mà, ít nhất là trong đầu tôi, sẽ giúp bạn có thể gõ một cái gì đó như $ runinnewterm ls / Ứng dụng