macos 从命令行打开新的终端选项卡 (Mac OS X)
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/7171725/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Open new Terminal Tab from command line (Mac OS X)
提问by Calvin Cheng
Is it possible to open a new tab in Mac OS X's terminal from the command line in a currently opened tab?
是否可以从当前打开的选项卡中的命令行在 Mac OS X 的终端中打开一个新选项卡?
I know that the keyboard shortcut to open a new tab in Terminal is "CMD+t" but I am looking for a script-based solution executed in the command line.
我知道在终端中打开新选项卡的键盘快捷键是“CMD+t”,但我正在寻找在命令行中执行的基于脚本的解决方案。
回答by mklement0
Update: This answer gained popularity based on the shell function posted below, which still works as of OSX 10.10 (with the exception of the -g
option).
However, a more fully featured, more robust, tested scriptversionis now available at the npm registryas CLI ttab
, which also supports iTerm2:
更新:这个答案基于下面发布的 shell 函数而广受欢迎,它从 OSX 10.10 开始仍然有效(-g
选项除外)。
但是,现在可以在npm 注册表中以 CLI 的形式提供功能更全、更健壮、经过测试的脚本版本,它也支持iTerm2:ttab
If you have Node.jsinstalled, simply run:
npm install -g ttab
(depending on how you installed Node.js, you may have to prepend
sudo
).Otherwise, follow these instructions.
Once installed, run
ttab -h
for concise usage information, orman ttab
to view the manual.
如果您安装了Node.js,只需运行:
npm install -g ttab
(根据您安装 Node.js 的方式,您可能需要在 前面加上
sudo
)。否则,请按照这些说明进行操作。
安装后,运行
ttab -h
以获取简明的使用信息,或man ttab
查看手册。
Building on the accepted answer, below is a bash convenience functionfor opening a new tab in the current Terminal window and optionally executing a command (as a bonus, there's a variant function for creating a new windowinstead).
基于已接受的答案,下面是一个 bash便利函数,用于在当前终端窗口中打开一个新选项卡并可选择执行命令(作为奖励,有一个用于创建新窗口的变体函数)。
If a command is specified, its first token will be used as the new tab's title.
如果指定了命令,则其第一个标记将用作新选项卡的标题。
Sample invocations:
示例调用:
# Get command-line help.
newtab -h
# Simpy open new tab.
newtab
# Open new tab and execute command (quoted parameters are supported).
newtab ls -l "$Home/Library/Application Support"
# Open a new tab with a given working directory and execute a command;
# Double-quote the command passed to `eval` and use backslash-escaping inside.
newtab eval "cd ~/Library/Application\ Support; ls"
# Open new tab, execute commands, close tab.
newtab eval "ls $HOME/Library/Application\ Support; echo Press a key to exit.; read -s -n 1; exit"
# Open new tab and execute script.
newtab /path/to/someScript
# Open new tab, execute script, close tab.
newtab exec /path/to/someScript
# Open new tab and execute script, but don't activate the new tab.
newtab -G /path/to/someScript
CAVEAT: When you run newtab
(or newwin
) from a script, the script's initialworking folder will be the working folder in the new tab/window, even if you change the working folder inside the script beforeinvoking newtab
/newwin
- pass eval
with a cd
command as a workaround (see example above).
CAVEAT:当您从脚本运行newtab
(或newwin
)时,脚本的初始工作文件夹将是新选项卡/窗口中的工作文件夹,即使您在调用newtab
/ newwin
-eval
使用cd
命令作为解决方法之前更改脚本内的工作文件夹(见上面的例子)。
Source code (paste into your bash profile, for instance):
源代码(例如粘贴到您的 bash 配置文件中):
# Opens a new tab in the current Terminal window and optionally executes a command.
# When invoked via a function named 'newwin', opens a new Terminal *window* instead.
function newtab {
# If this function was invoked directly by a function named 'newwin', we open a new *window* instead
# of a new tab in the existing window.
local funcName=$FUNCNAME
local targetType='tab'
local targetDesc='new tab in the active Terminal window'
local makeTab=1
case "${FUNCNAME[1]}" in
newwin)
makeTab=0
funcName=${FUNCNAME[1]}
targetType='window'
targetDesc='new Terminal window'
;;
esac
# Command-line help.
if [[ "" == '--help' || "" == '-h' ]]; then
cat <<EOF
Synopsis:
$funcName [-g|-G] [command [param1 ...]]
Description:
Opens a $targetDesc and optionally executes a command.
The new $targetType will run a login shell (i.e., load the user's shell profile) and inherit
the working folder from this shell (the active Terminal tab).
IMPORTANT: In scripts, \`$funcName\` *statically* inherits the working folder from the
*invoking Terminal tab* at the time of script *invocation*, even if you change the
working folder *inside* the script before invoking \`$funcName\`.
-g (back*g*round) causes Terminal not to activate, but within Terminal, the new tab/window
will become the active element.
-G causes Terminal not to activate *and* the active element within Terminal not to change;
i.e., the previously active window and tab stay active.
NOTE: With -g or -G specified, for technical reasons, Terminal will still activate *briefly* when
you create a new tab (creating a new window is not affected).
When a command is specified, its first token will become the new ${targetType}'s title.
Quoted parameters are handled properly.
To specify multiple commands, use 'eval' followed by a single, *double*-quoted string
in which the commands are separated by ';' Do NOT use backslash-escaped double quotes inside
this string; rather, use backslash-escaping as needed.
Use 'exit' as the last command to automatically close the tab when the command
terminates; precede it with 'read -s -n 1' to wait for a keystroke first.
Alternatively, pass a script name or path; prefix with 'exec' to automatically
close the $targetType when the script terminates.
Examples:
$funcName ls -l "$Home/Library/Application Support"
$funcName eval "ls \$HOME/Library/Application\ Support; echo Press a key to exit.; read -s -n 1; exit"
$funcName /path/to/someScript
$funcName exec /path/to/someScript
EOF
return 0
fi
# Option-parameters loop.
inBackground=0
while (( $# )); do
case "" in
-g)
inBackground=1
;;
-G)
inBackground=2
;;
--) # Explicit end-of-options marker.
shift # Move to next param and proceed with data-parameter analysis below.
break
;;
-*) # An unrecognized switch.
echo "$FUNCNAME: PARAMETER ERROR: Unrecognized option: ''. To force interpretation as non-option, precede with '--'. Use -h or --h for help." 1>&2 && return 2
;;
*) # 1st argument reached; proceed with argument-parameter analysis below.
break
;;
esac
shift
done
# All remaining parameters, if any, make up the command to execute in the new tab/window.
local CMD_PREFIX='tell application "Terminal" to do script'
# Command for opening a new Terminal window (with a single, new tab).
local CMD_NEWWIN=$CMD_PREFIX # Curiously, simply executing 'do script' with no further arguments opens a new *window*.
# Commands for opening a new tab in the current Terminal window.
# Sadly, there is no direct way to open a new tab in an existing window, so we must activate Terminal first, then send a keyboard shortcut.
local CMD_ACTIVATE='tell application "Terminal" to activate'
local CMD_NEWTAB='tell application "System Events" to keystroke "t" using {command down}'
# For use with -g: commands for saving and restoring the previous application
local CMD_SAVE_ACTIVE_APPNAME='tell application "System Events" to set prevAppName to displayed name of first process whose frontmost is true'
local CMD_REACTIVATE_PREV_APP='activate application prevAppName'
# For use with -G: commands for saving and restoring the previous state within Terminal
local CMD_SAVE_ACTIVE_WIN='tell application "Terminal" to set prevWin to front window'
local CMD_REACTIVATE_PREV_WIN='set frontmost of prevWin to true'
local CMD_SAVE_ACTIVE_TAB='tell application "Terminal" to set prevTab to (selected tab of front window)'
local CMD_REACTIVATE_PREV_TAB='tell application "Terminal" to set selected of prevTab to true'
if (( $# )); then # Command specified; open a new tab or window, then execute command.
# Use the command's first token as the tab title.
local tabTitle=
case "$tabTitle" in
exec|eval) # Use following token instead, if the 1st one is 'eval' or 'exec'.
tabTitle=$(echo "" | awk '{ print }')
;;
cd) # Use last path component of following token instead, if the 1st one is 'cd'
tabTitle=$(basename "")
;;
esac
local CMD_SETTITLE="tell application \"Terminal\" to set custom title of front window to \"$tabTitle\""
# The tricky part is to quote the command tokens properly when passing them to AppleScript:
# Step 1: Quote all parameters (as needed) using printf '%q' - this will perform backslash-escaping.
local quotedArgs=$(printf '%q ' "$@")
# Step 2: Escape all backslashes again (by doubling them), because AppleScript expects that.
local cmd="$CMD_PREFIX \"${quotedArgs//\/\\}\""
# Open new tab or window, execute command, and assign tab title.
# '>/dev/null' suppresses AppleScript's output when it creates a new tab.
if (( makeTab )); then
if (( inBackground )); then
# !! Sadly, because we must create a new tab by sending a keystroke to Terminal, we must briefly activate it, then reactivate the previously active application.
if (( inBackground == 2 )); then # Restore the previously active tab after creating the new one.
osascript -e "$CMD_SAVE_ACTIVE_APPNAME" -e "$CMD_SAVE_ACTIVE_TAB" -e "$CMD_ACTIVATE" -e "$CMD_NEWTAB" -e "$cmd in front window" -e "$CMD_SETTITLE" -e "$CMD_REACTIVATE_PREV_APP" -e "$CMD_REACTIVATE_PREV_TAB" >/dev/null
else
osascript -e "$CMD_SAVE_ACTIVE_APPNAME" -e "$CMD_ACTIVATE" -e "$CMD_NEWTAB" -e "$cmd in front window" -e "$CMD_SETTITLE" -e "$CMD_REACTIVATE_PREV_APP" >/dev/null
fi
else
osascript -e "$CMD_ACTIVATE" -e "$CMD_NEWTAB" -e "$cmd in front window" -e "$CMD_SETTITLE" >/dev/null
fi
else # make *window*
# Note: $CMD_NEWWIN is not needed, as $cmd implicitly creates a new window.
if (( inBackground )); then
# !! Sadly, because we must create a new tab by sending a keystroke to Terminal, we must briefly activate it, then reactivate the previously active application.
if (( inBackground == 2 )); then # Restore the previously active window after creating the new one.
osascript -e "$CMD_SAVE_ACTIVE_WIN" -e "$cmd" -e "$CMD_SETTITLE" -e "$CMD_REACTIVATE_PREV_WIN" >/dev/null
else
osascript -e "$cmd" -e "$CMD_SETTITLE" >/dev/null
fi
else
# Note: Even though we do not strictly need to activate Terminal first, we do it, as assigning the custom title to the 'front window' would otherwise sometimes target the wrong window.
osascript -e "$CMD_ACTIVATE" -e "$cmd" -e "$CMD_SETTITLE" >/dev/null
fi
fi
else # No command specified; simply open a new tab or window.
if (( makeTab )); then
if (( inBackground )); then
# !! Sadly, because we must create a new tab by sending a keystroke to Terminal, we must briefly activate it, then reactivate the previously active application.
if (( inBackground == 2 )); then # Restore the previously active tab after creating the new one.
osascript -e "$CMD_SAVE_ACTIVE_APPNAME" -e "$CMD_SAVE_ACTIVE_TAB" -e "$CMD_ACTIVATE" -e "$CMD_NEWTAB" -e "$CMD_REACTIVATE_PREV_APP" -e "$CMD_REACTIVATE_PREV_TAB" >/dev/null
else
osascript -e "$CMD_SAVE_ACTIVE_APPNAME" -e "$CMD_ACTIVATE" -e "$CMD_NEWTAB" -e "$CMD_REACTIVATE_PREV_APP" >/dev/null
fi
else
osascript -e "$CMD_ACTIVATE" -e "$CMD_NEWTAB" >/dev/null
fi
else # make *window*
if (( inBackground )); then
# !! Sadly, because we must create a new tab by sending a keystroke to Terminal, we must briefly activate it, then reactivate the previously active application.
if (( inBackground == 2 )); then # Restore the previously active window after creating the new one.
osascript -e "$CMD_SAVE_ACTIVE_WIN" -e "$CMD_NEWWIN" -e "$CMD_REACTIVATE_PREV_WIN" >/dev/null
else
osascript -e "$CMD_NEWWIN" >/dev/null
fi
else
# Note: Even though we do not strictly need to activate Terminal first, we do it so as to better visualize what is happening (the new window will appear stacked on top of an existing one).
osascript -e "$CMD_ACTIVATE" -e "$CMD_NEWWIN" >/dev/null
fi
fi
fi
}
# Opens a new Terminal window and optionally executes a command.
function newwin {
newtab "$@" # Simply pass through to 'newtab', which will examine the call stack to see how it was invoked.
}
回答by Gordon Davisson
Try this:
试试这个:
osascript -e 'tell application "Terminal" to activate' -e 'tell application "System Events" to tell process "Terminal" to keystroke "t" using command down'
回答by dleavitt
Here's how it's done by bash_it:
这是bash_it是如何完成的:
function tab() {
osascript 2>/dev/null <<EOF
tell application "System Events"
tell process "Terminal" to keystroke "t" using command down
end
tell application "Terminal"
activate
do script with command "cd \"$PWD\"; $*" in window 1
end tell
EOF
}
After adding this to your .bash_profile, you'd use the tab
command to open the current working directory in a new tab.
将此添加到您的 .bash_profile 后,您将使用该tab
命令在新选项卡中打开当前工作目录。
See: https://github.com/revans/bash-it/blob/master/plugins/available/osx.plugin.bash#L3
请参阅:https: //github.com/revans/bash-it/blob/master/plugins/available/osx.plugin.bash#L3
回答by Szymon Morawski
osascript -e 'tell app "Terminal"
do script "echo hello"
end tell'
This opens a new terminal and executes the command "echo hello" inside it.
这将打开一个新终端并在其中执行命令“echo hello”。
回答by CharlesB
回答by Aziz Alto
The keyboard shortcut cmd-t
opens a new tab, so you can pass this keystroke to OSA command as follows:
键盘快捷键会cmd-t
打开一个新选项卡,因此您可以将此按键传递给 OSA 命令,如下所示:
osascript -e 'tell application "System Events"' -e 'keystroke "t" using command down' -e 'end tell'
osascript -e 'tell application "System Events"' -e 'keystroke "t" using command down' -e 'end tell'
回答by richtera
I added these to my .bash_profile so I can have access to tabname and newtab
我将这些添加到我的 .bash_profile 以便我可以访问 tabname 和 newtab
tabname() {
printf "\e]1;\a"
}
new_tab() {
TAB_NAME=
COMMAND=
osascript \
-e "tell application \"Terminal\"" \
-e "tell application \"System Events\" to keystroke \"t\" using {command down}" \
-e "do script \"printf '\\e]1;$TAB_NAME\\a'; $COMMAND\" in front window" \
-e "end tell" > /dev/null
}
So when you're on a particular tab you can just type
因此,当您在特定选项卡上时,您只需键入
tabname "New TabName"
to organize all the open tabs you have. It's much better than getting info on the tab and changing it there.
组织您拥有的所有打开的选项卡。这比在选项卡上获取信息并在那里进行更改要好得多。
回答by xdev
when you are in a terminal window, command + n => opens a new terminal and command + t => opens a new tab in current terminal window
当您在终端窗口中时, command + n => 打开一个新终端, command + t => 在当前终端窗口中打开一个新选项卡
回答by Andrew Schreiber
If you are using iTermthis command will open a new tab:
如果您使用的是iTerm,此命令将打开一个新选项卡:
osascript -e 'tell application "iTerm" to activate' -e 'tell application "System Events" to tell process "iTerm" to keystroke "t" using command down'
回答by neophytte
I know this is an old post, but this worked for me:
我知道这是一个旧帖子,但这对我有用:
open -a Terminal "`pwd`"
To run a command as requested below takes some jiggery:
要按照下面的要求运行命令需要一些麻烦:
echo /sbin/ping 8.8.8.8 > /tmp/tmp.sh;chmod a+x /tmp/tmp.sh;open -a Terminal /tmp/tmp.sh