Я пытался выяснить, как запустить команду bash в новом окне Max OS X Terminal.app. Как пример, вот как я должен выполнить свою команду в новом процессе bash:
bash -c "my command here"
Но это использует существующее окно терминала вместо создания нового. Я хочу что-то вроде:
Terminal.app -c "my command here"
Но, конечно, это не работает. Мне известна команда "open -a Terminal.app", но я не вижу, как пересылать аргументы в терминал, или даже если я сделал какие аргументы использовать.
Ответ 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"'
хотя вам придется либо избежать двойных кавычек, либо не использовать одиночные кавычки
Ответ 2
Частичное решение:
Поместите вещи, которые вы хотите сделать в оболочке script, например
#!/bin/bash
ls
echo "yey!"
И не забудьте 'chmod +x file
' сделать его исполняемым. Тогда вы можете
open -a Terminal.app scriptfile
и он будет запущен в новом окне. Добавьте 'bash
' в конец script, чтобы сохранить выход нового сеанса. (Хотя вам, возможно, придется выяснить, как загрузить пользовательские rc файлы и прочее..)
Ответ 3
Я пытался это сделать некоторое время. Вот script, который изменяется в тот же рабочий каталог, запускает команду и закрывает окно терминала.
#!/bin/sh
osascript <<END
tell application "Terminal"
do script "cd \"`pwd`\";$1;exit"
end tell
END
Ответ 4
В случае, если кто-то заботится, здесь эквивалент 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
Ответ 5
Я сделал функциональную версию ответа Oscar, это также копирует среду и изменения в соответствующий каталог
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
Ответ 6
Здесь еще один возьмите его (также используя 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
Ответ 7
Здесь мой awesome script, он создает новое окно терминала, если это необходимо, и переключается в каталог 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 text item delimiters
set AppleScript text item delimiters to "'"
set the parsedList to every text item of theString
set AppleScript text item delimiters to "'\\''"
set theString to the parsedList as string
set AppleScript text item delimiters to oldDelims
return "'" & theString & "'"
end quote_for_bash
Ответ 8
Вы также можете вызвать функцию новой команды терминала, нажав комбинацию клавиш Shift + ⌘ + N
. Команда, введенная в поле, будет запущена в новом окне терминала.
Ответ 9
Коллега спросил меня, как открыть ОЧЕНЬ много сессий ssh. Для написания сценария я использовал кобальтовый ответ:
tmpdir=$( mktemp -d )
trap '$DEBUG rm -rf $tmpdir ' EXIT
index=1
{
cat <<COMMANDS
ssh user1@host1
ssh user2@host2
COMMANDS
} | while read command
do
COMMAND_FILE=$tmpdir/$index.command
index=$(( index + 1 ))
echo $command > $COMMAND_FILE
chmod +x $COMMAND_FILE
open $COMMAND_FILE
done
sleep 60
Обновляя список команд (они не должны быть ssh-вызовами), вы получите дополнительное открытое окно для каждой выполняемой команды. sleep 60
в конце предназначен для хранения файлов .command
во время их выполнения. В противном случае оболочка завершается слишком быстро, выполняя ловушку для удаления временного каталога (созданного mktemp), прежде чем запущенные сеансы смогут прочитать файлы.
Ответ 10
Я называю это script trun. Я предлагаю положить его в каталог на вашем исполняемом пути. Убедитесь, что он выполним следующие действия:
chmod +x ~/bin/trun
Затем вы можете запускать команды в новом окне, просто добавляя trun перед ними, например:
trun tail -f /var/log/system.log
Здесь script. Он делает некоторые причудливые вещи, такие как передать ваши аргументы, изменить строку заголовка, очистить экран, чтобы удалить беспорядок запуска оболочки, удалить его файл, когда он будет выполнен. Используя уникальный файл для каждого нового окна, он может быть использован для одновременного создания множества окон.
#!/bin/bash
# make this file executable with chmod +x trun
# create a unique file in /tmp
trun_cmd=`mktemp`
# make it cd back to where we are now
echo "cd `pwd`" >$trun_cmd
# make the title bar contain the command being run
echo 'echo -n -e "\033]0;'$*'\007"' >>$trun_cmd
# clear window
echo clear >>$trun_cmd
# the shell command to execute
echo $* >>$trun_cmd
# make the command remove itself
echo rm $trun_cmd >>$trun_cmd
# make the file executable
chmod +x $trun_cmd
# open it in Terminal to run it in a new Terminal window
open -b com.apple.terminal $trun_cmd
Ответ 11
open `which $command`
работает для простых случаев.