从命令行(Mac OS X)打开新的“terminal”选项卡

是否可以在当前打开的选项卡中的命令行中打开Mac OS Xterminal中的新选项卡?

我知道在terminal打开一个新标签的键盘快捷键是“CMD + T”,但我正在寻找在命令行中执行的基于脚本的解决scheme。

尝试这个:

osascript -e 'tell application "Terminal" to activate' -e 'tell application "System Events" to tell process "Terminal" to keystroke "t" using command down' 

更新 :这个答案基于下面发布的shell函数获得了普及,这个函数在OSX 10.10中仍然有效(除-g选项外)。
但是, npmregistry中现在提供了 function更全面,更强大,经过testing的脚本版本 ,作为CLI ttab ,它也支持iTerm2

  • 如果您安装了Node.js ,只需运行:

     npm install -g ttab 

    (取决于你如何安装Node.js,你可能需要预先安装sudo )。

  • 否则,请按照这些说明 。

  • 安装完成后,运行ttab -h以获得简明的使用信息,或者运行ttab -h查看手册。


在接受的答案的基础上,下面是一个bash 便利function,用于在当前的terminal窗口中打开一个新的选项卡,并可选地执行命令(作为奖励,而不是创build一个新窗口的变体function)。

如果指定了一个命令,它的第一个标记将被用作新标签的标题。

示例调用:

  # 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 :从脚本运行newtab (或newwin )时, 即使在调用newtab / newwin 之前更改脚本中的工作文件夹,脚本的初始工作文件夹也将成为新选项卡/窗口中的工作文件夹 – 传递eval一个cd命令作为解决方法(见上面的例子)。

源代码(例如粘贴到你的bashconfiguration文件中):

 # 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 [[ "$1" == '--help' || "$1" == '-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 (ie, 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; ie, 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 "$1" 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: '$1'. 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=$1 case "$tabTitle" in exec|eval) # Use following token instead, if the 1st one is 'eval' or 'exec'. tabTitle=$(echo "$2" | awk '{ print $1 }') ;; cd) # Use last path component of following token instead, if the 1st one is 'cd' tabTitle=$(basename "$2") ;; 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. } 

以下是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 } 

将这个添加到你的.bash_profile之后,你可以使用tab命令在新的选项卡中打开当前的工作目录。

请参阅: https : //github.com/revans/bash-it/blob/master/plugins/available/osx.plugin.bash#L3

如果你使用oh-my-zsh (每个时髦的极客应该使用的),在.zshrc中激活“osx”插件后,只需inputtab命令; 它会在你所在的目录中打开一个新的标签和cd

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

这将打开一个新的terminal并在其中执行命令“echo hello”。

键盘快捷键cmd-t打开一个新选项卡,因此您可以按如下方式将此按键传递给OSA命令:

osascript -e 'tell application "System Events"' -e 'keystroke "t" using command down' -e 'end tell'

我将这些添加到我的.bash_profile,所以我可以访问tabname和newtab

 tabname() { printf "\e]1;$1\a" } new_tab() { TAB_NAME=$1 COMMAND=$2 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 } 

所以当你在一个特定的选项卡上,你可以input

 tabname "New TabName" 

组织所有你打开的标签。 这比在标签上获取信息并在那里改变要好得多。

当你在terminal窗口时,命令+ n =>打开一个新的terminal,命令+ t =>在当前的terminal窗口中打开一个新的标签

如果你正在使用iTerm这个命令将打开一个新的标签:

 osascript -e 'tell application "iTerm" to activate' -e 'tell application "System Events" to tell process "iTerm" to keystroke "t" using command down' 

基于标准脚本命令(回显),这个简单的片段呢?

 # set mac osx's terminal title to "My Title" echo -n -e "\033]0;My Title\007" 

随着X的安装(例如从自制软件,或Quartz),一个简单的“xterm&”(几乎)做的伎俩,它打开一个新的terminal窗口(不是一个标签,但)。