web-dev-qa-db-ja.com

新しいMac OS Xターミナルウィンドウでコマンドを実行する

新しいMax OS X Terminal.appウィンドウでbashコマンドを実行する方法を見つけようとしてきました。例として、新しいbashプロセスでコマンドを実行する方法を次に示します。

bash -c "my command here"

しかし、これは新しいウィンドウを作成する代わりに、既存のターミナルウィンドウを再利用します。私のようなものが欲しい:

Terminal.app -c "my command here"

しかし、もちろんこれは機能しません。 「open -a Terminal.app」コマンドは知っていますが、引数を端末に転送する方法がわかりません。また、どの引数を使用したかはわかりません。

83
Walt D

私が頭の外でそれを行うと考えることができる1つの方法は、.commandファイルを作成し、次のように実行することです:

echo echo hello > sayhi.command; chmod +x sayhi.command; open sayhi.command

またはapplescriptを使用します。

osascript -e 'tell application "Terminal" to do script "echo hello"'

ただし、多くの二重引用符をエスケープするか、単一引用符を使用できないようにする必要があります

82
cobbal

部分的な解決策:

あなたがしたいことをシェルスクリプトに入れてください

#!/bin/bash
ls
echo "yey!"

そして、忘れないでください 'chmod +x file '実行可能にします。その後、次のことができます

open -a Terminal.app scriptfile

新しいウィンドウで実行されます。新しいセッションが終了しないようにするには、スクリプトの最後に「bash」を追加します。 (ただし、ユーザーのrcファイルなどを読み込む方法を理解する必要があるかもしれません。)

63
0scar

私はしばらくこれをやってみました。同じ作業ディレクトリに変更し、コマンドを実行し、ターミナルウィンドウを閉じるスクリプトを次に示します。

#!/bin/sh 
osascript <<END 
tell application "Terminal"
    do script "cd \"`pwd`\";$1;exit"
end tell
END
31
kimchi

誰もが気になる場合のために、iTermに相当するものを次に示します。

#!/bin/sh
osascript <<END
tell application "iTerm"
 tell the first terminal
  launch session "Default Session"
  tell the last session
   write text "cd \"`pwd`\";$1;exit"
  end tell
 end tell
end tell
END
8
Al Chou

オスカーの答えの機能バージョンを作成しました。これは環境と変更を適切なディレクトリにコピーします

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
3
Dave Butler

これについてのもう1つの考え方があります(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

2
pete

これは私の素晴らしいスクリプトです。必要に応じて新しいターミナルウィンドウを作成し、Finderが最前面にある場合は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
2
w00t

Shift + ⌘ + Nキーの組み合わせを押して、ターミナルの新しいコマンド機能を呼び出すこともできます。ボックスに入れたコマンドは、新しいターミナルウィンドウで実行されます。

0
ayaz