การเปิดเทอร์มินัลใหม่จากบรรทัดคำสั่งและเรียกใช้คำสั่งบน Mac OS X หรือไม่


24

มีวิธีการเปิดเทอร์มินัลใหม่จากบรรทัดคำสั่งและการรันคำสั่งบนเทอร์มินัลใหม่นั้น (บน Mac) หรือไม่?

เช่นสิ่งที่ชอบ:

Terminal -e ls

ที่lsทำงานในสถานีใหม่


ฉันพยายามหาวิธีใช้ทับทิมบนเซิร์ฟเวอร์ rails ในเทอร์มินัลใหม่โดยใช้ 1 คำสั่ง
zlog

ฟังดูสมเหตุสมผล - ฉันคิดว่าคุณต้องการให้ stdout ปรากฏในเทอร์มินัลที่เปิดอยู่ ในกรณีนั้นใช่คุณต้องการเขียนเชลล์สคริปต์ที่ทำงานตามที่คุณต้องการจากนั้นเปลี่ยนนามสกุลเป็น. คำสั่งดังต่อไปนี้
Norman Grey

คำตอบ:


24
osascript -e 'tell app "Terminal"
    do script "echo hello"
end tell'

นี่เป็นการเปิดเทอร์มินัลใหม่และดำเนินการคำสั่ง "echo hello" ที่อยู่ภายใน


ฉันแน่ใจว่าสิ่งนี้ชัดเจนสำหรับผู้เชี่ยวชาญ applescript แต่มีตัวอย่างเกี่ยวกับการเปิดตัวโปรแกรมใดบ้าง โดยพื้นฐานแล้วฉันสามารถทำ 'xterm -e somecomnand'
gman

3
สิ่งนี้สามารถสั้นลงได้เล็กน้อย:osascript -e 'tell app "Terminal" to do script "echo hello"'
joemaller

1
วิธีการตั้งค่าหน้าต่างด้านบนเทอร์มินัลใหม่ใช้งานอยู่?
Jenkamen

และฉันจะส่งต่อข้อโต้แย้งไปตามบรรทัดของ"$@"เชลล์ได้อย่างไร แต่ในสคริปต์ osa
rednoah

3

คุณสามารถทำได้ในลักษณะวงเวียน:

% cat /tmp/hello.command
#! /bin/sh -
say hello
% chmod +x /tmp/hello.command
% open /tmp/hello.command

เชลล์สคริปต์ที่มีส่วนขยาย.commandและสามารถเรียกใช้งานได้สามารถดับเบิลคลิกเพื่อเรียกใช้ภายในหน้าต่าง Terminal ใหม่ คำสั่งopenตามที่คุณอาจรู้คือเทียบเท่ากับการดับเบิลคลิกที่วัตถุ Finder ดังนั้นขั้นตอนนี้จะจบลงด้วยการรันคำสั่งในสคริปต์ภายในหน้าต่างเทอร์มินัลใหม่

บิดเล็กน้อย แต่ดูเหมือนว่าจะทำงาน ฉันรู้สึกมั่นใจว่าจะต้องมีเส้นทางที่ตรงไปมากกว่านี้ (คุณพยายามทำอะไรจริง ๆ ) แต่มันหนีฉันไปแล้ว


ฉันลองสิ่งนี้และเทอร์มินัลใหม่จะเปิดขึ้น แต่จากนั้นฉันจะได้รับ: ~ $ /Users/username/Work/Dev/scripts/hello.command; ออกจาก; ออกจากระบบ [ดำเนินการเสร็จสิ้น] นี่คือ hello.command ของฉัน: สคริปต์ $ cat hello.command #! / bin / sh - กล่าวทักทาย
zlog

ตอบนั่นไม่ได้จัดรูปแบบอย่างถูกต้อง แต่ฉันคิดว่าคุณเข้าใจ
zlog

@zlog: แต่มันพูดว่า 'สวัสดี' ใช่ไหม ในการตั้งค่าของ Terminal.app ให้ดูที่แท็บ 'การตั้งค่า' และ 'เชลล์' คุณจะเห็นเมนู 'เมื่อเชลล์ออก:' ฉันคิดว่าค่าเริ่มต้นคือ 'อย่าปิดหน้าต่าง' และนั่นคือสิ่งที่คุณเห็น หากคุณเปลี่ยนสิ่งนี้เป็น 'ปิดถ้าเชลล์ออกจากระบบอย่างหมดจด' หน้าต่างเทอร์มินัลจะหายไปเมื่อเชลล์สคริปต์เสร็จสิ้น
นอร์แมนเกรย์

ฉันสามารถสั่งให้เปิดเซสชันไว้และไม่ออกจากระบบได้หรือไม่
Royi

2
#!/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(แท็บซ้ำ) ดังนั้นฉันจึงสามารถเรียกใช้dtเพื่อเปิดแท็บในโฟลเดอร์เดียวกันหรือdt lsเรียกใช้lsคำสั่งที่นั่นได้


2

งานนี้อย่างน้อยภายใต้ Mountain Lion มันเริ่มต้นเชลล์แบบโต้ตอบในแต่ละครั้งแม้ว่าคุณจะสามารถแทนที่สิ่งนั้นได้หลังจากข้อเท็จจริงโดยเรียกมันว่า "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 

0

ฉันจะทำเช่นนี้กับ AppleScript คุณสามารถปรับปรุงได้โดยใช้คำสั่ง osascript สคริปต์ของคุณจะเป็นเช่น:

tell application "Terminal"
  activate
  tell application "System Events"
    keystroke "t" using {command down}
  end tell
end tell

หากคุณจะเข้าถึงเฉพาะที่เทอร์มินัลคุณสามารถละทั้งหมดยกเว้นคำสั่ง tell ปานกลาง หากคุณต้องการหน้าต่างใหม่แทนแท็บใหม่ให้แทนที่การกดแป้นพิมพ์ด้วย n

ฉันไม่ได้มีประสบการณ์มากพอที่จะรู้วิธีรับอาร์กิวเมนต์บรรทัดคำสั่งจากนั้นพิมพ์ใหม่ในหน้าต่างใหม่ แต่ฉันแน่ใจว่ามันเป็นไปได้และไม่ยากเกินไป

นอกจากนี้ฉันคิดว่ามันใช้งานได้และฉันไม่สามารถทดสอบได้ในตอนนี้ แต่ฉันค่อนข้างแน่ใจว่าคุณสามารถเริ่มเชลล์สคริปต์ด้วยตัวแปรบางอย่างใน #! / usr / bin / osascript -e แล้วบันทึกเป็นไฟล์ปฏิบัติการ แต่คุณต้องการ. ซึ่งอย่างน้อยในหัวของฉันจะทำให้คุณพิมพ์บางอย่างเช่น $ runinnewterm ls / Applications

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.