如何启动一个终端并在其中输入文本?

如何启动一个终端并在其中输入文本?

我经常

  1. 在终端中编写我不记得的命令,然后

  2. 在按 之前,从剪贴板粘贴一些路径或文件名Enter

我以为这会很有趣用一个快捷方式完成第一部分然后粘贴即可,通过关键操作实现上述目的。


基于这个答案在“如何分配某个键盘快捷键来粘贴特定项目?”,我添加了一个快捷方式bash -c "xsel -ib <<< 'MY_COMMAND'",它将命令发送到剪贴板。但是,当将其粘贴到终端时,该命令会自动执行,因为末尾有一个“Enter”(换行符):

执行“xsel -ib <<< 'MY_COMMAND' ”后显示剪贴板


[这是在 Kubuntu 20.04 中。]

答案1

基于回答“如何避免 xsel 将文本发送到剪贴板(末尾带有空格/回车)”我现在有一个解决方法。我不知道如何启动终端并在其中等待新输入(键入、粘贴)的文本,只需一个动作(脚本/命令/快捷方式)但现在我可以这样做脚步:

  1. 使用与 关联的快捷方式bash -c 'printf "%s" "MY_TEXT" | xsel -b' ; konsole将该文本发送到剪贴板并打开一个终端,例如konsole
  2. Ctrl-V 将文本从剪贴板粘贴到终端(或 Ctrl-Shift-V)

(这两个键盘操作实现了最初问题中的第 1 点。从 YouTube 下载音频是一个有用的示例:(#1)bash -c 'printf "%s" "youtube-dl -f bestaudio[ext=m4a]" | xsel -b' && konsole将必要的命令复制到剪贴板并打开一个终端,其中 (#2 )它可以被粘贴,从而为您提供一个窗口来添加 youtube 链接与另一个(#3)复制+(#4)粘贴 - 或者也许只是拖放(即#3),然后按(#4/5)Enter。总共 4 或 5 个键盘和鼠标操作,无需实际编写任何内容。)

我很想用一个命令来实现这一点,但我认为无论如何这都适合作为补充答案(而不是在问题主体内)。

答案2

如何启动一个终端并在其中输入文本?

在终端中运行命令:

在终端中键入文本或执行命令非常相似。首先,让我们看看如何打开终端执行命令。

要执行命令,您可以执行konsole -e MY_COMMAND.
当然,这不是您想要的,但它会有所帮助。
我首先需要说的是,在我见过的任何终端中都没有官方选项konsole,但我们可以根据konsole -e功能制作一个。
目前,我只知道如何使用gnome-terminal和 with执行此操作konsole,并且可能有类似的方法可以使用其他终端仿真器执行此操作。

通过多次测试,我注意到一个大问题:konsole -e执行命令后停止:konsole -e sleep 10将在 10 秒内显示konsole终端,无法运行 shell 命令,然后它会自行关闭。
konsole如果我想在终端内执行某些操作,我需要终端保持打开状态。为什么会这样呢?我认为它在某些情况下是有意义的,例如konsole -e top(任务管理器)或konsole -e vim(文本编辑器),并konsole在退出时退出vim(然后,这vim就像可以关闭的 GUI 文本编辑器,例如gedit)。我对or 也
有同样的问题。 所以我看到了st -e MY_COMMANDgnome-terminal -- MY_COMMAND
这个帖子它完全解决了问题(除了它仅适用于gnome-terminalxterm,因此可能有也可能没有类似的解决方案konsole)。

首先,让我们创建一个要运行的函数gnome-terminal,或者konsole在执行某些操作后不会退出的函数:

bash_in_gnome_terminal(){
    local IFS
    printf -v cmd %q ". ~/.bashrc; set -m; $*"
    gnome-terminal -- bash -c "bash --rcfile <(echo $cmd)"
}

bash_in_konsole(){
    local IFS
    konsole -e bash --rcfile <(printf '. ~/.bashrc; set -m; %s\n' "$*")
}

您可以使用它进行测试bash_in_konsole 'echo foo',您应该会看到类似以下内容的内容:

foo
username@computer:~$

输入文本tmux

我首先考虑的是输入文本,但如果窗口没有聚焦,xdotool就会出现一些问题。konsole通常,tmux不预先安装。在基于 Debian 的发行版上,安装它的命令是sudo apt-get install tmux。其实tmux有一个send-keys特点。当然,如果是 with tmux,您应该运行一个tmux会话。也许您需要tmux先安装。如果您想了解其工作原理,请尝试以下操作:

  • tmux Enter(发起会议)。

  • Ctrl-b:(在命令模式下输入)。

  • send-keys "echo foo"Enter(就像您输入的一样输入),您应该会看到类似以下内容的内容:

    用户名@计算机:~$ echo foo

现在,您可以合并这两部分:
bash_in_konsole 'exec tmux new-session -A -t "temporary" \; run-shell "sleep .1" \; send-keys "C-u" "echo foo" "C-l"'
我会解释 :

  • exec当你离开终端时tmux,你就退出了konsole
  • new-session -A -t "temporary"如果您之前使用过该命令,则会启动相同的会话,但是随后,会话将被编号为巨大的数字。
  • send-keys "echo foo"echo foo将在终端中输入。
    不幸的是,它将被写入两次(一次在 shell 提示符之前,一次在 shell 提示符内)。
  • "C-u"将清除该行(如果您使用-A -t "temporary"参数,则这是必需的)。
  • "C-l"也作为按键发送,是清除屏幕的Ctrl-l官方快捷方式(避免看到两次)。bash
    echo foo
    笔记:Ctrl-Alt-l也适用于某些 shell。也许不上bash
  • foo在您按下Enter按键之前,它不会单独回显。您还可以将命令修改echo foo为您想要的任何内容。

末尾没有“Enter”(换行符)的剪贴板:

如果您复制了 URL http://youtube.com/foobar,则 的输出将xsel -ob包含尾随换行符\n(与按 Enter 时通常得到的字符相同)。根据具体情况,您可以执行以下操作:

  • 仅获取没有尾随空格的第一行:xsel -ob | head -1 | tr -d "\n"
  • 要放置空格而不是换行符:xsel -ob | tr "\n" " ".
    为什么要有一个空格而不是“什么都没有”?因为您可能复制了多个 URL(多行)并且youtube-dl可以下载一组以空格分隔的视频。

警告::在您的情况下,您正在使用youtube-dl,并且 YouTube 的 URL 可能包含时间戳之类的内容,这http://youtube.com/foobar&t=21m17s意味着视频将在21:17您在网络浏览器中启动视频时自动开始。此外,由于某种原因,时间戳可能会自动出现。 & 符号&bash进行分叉的命令。这意味着Ctrl-c如果您不小心按下 ,将很难计算它Enter。您可能还想转义通常转义并出现在 YouTube URL 中的字符,例如?=,但zsh仅适用于(也可能是其他一些 shell)用户:使用zsh?会导致no matches found错误消息。

  • bash, 仅转义 & 符号: xsel -ob | tr "\n" " " | sed "s/&/\\\\&/g"
  • zsh,转义 3 个有问题的符号:xsel -ob | tr "\n" " " | sed "s/\(?\|=\|&\)/\\\\\1/g"
    笔记:大多数时候,我假设读者是bash用户,但我个人使用zsh,因此大多数命令也应该适用zsh。如果您在使用其他 shell 时遇到问题,请告诉我。

官方解决方案(合并前 3 部分):

步骤0:我假设读者想要使用bash,konsoleyoutube-dl命令来执行此操作,并且键入的命令应包括剪贴板内容。我还假设这是一个快捷方式konsole(对于其他只在终端中运行它的读者,请确保~/.bashrc在编辑后重新加载)。

步骤1 :tmux如果没有,请安装。

第2步 :复制以下 7 行并将其粘贴到您的~/.bashrc文件中(并保存文件):

bash_in_konsole(){
    local IFS
    konsole -e bash --rcfile <(printf '. ~/.bashrc; set -m; %s\n' "$*")
}

tmux_in_konsole(){
    bash_in_konsole 'exec tmux new-session -A -t "temporary" \; run-shell "sleep .1" \; send-keys "C-u" "' "$*" '" "C-l"'
}

步骤3:现在,您可以使用 进行测试tmux_in_konsole "youtube-dl -f bestaudio[ext=m4a] $(xsel -ob | tr "\n" " " | sed "s/&/\\\\&/g")"。这是您应该为快捷方式输入的命令konsole。假设您复制了 URL http://youtube.com/watch?v=foobarlorem&t=10s。预期结果是:

username@computer:~$ youtube-dl -f bestaudio[ext=m4a] http://youtube.com/watch?v=foobarlorem\&t=10s

步骤 3之二:(替代3)如果您不想粘贴剪贴板内容,则更简单。您可以使用 进行测试tmux_in_konsole "youtube-dl -f bestaudio[ext=m4a] "。预期结果是:

username@computer:~$ youtube-dl -f bestaudio[ext=m4a] 

步骤 ω :(退出时konsole) 一旦您输入了要下载的视频的 URL youtube-dl,并输入了Enter,并且完成了视频下载,您就可以退出此终端。
要退出tmux,只需按Ctrl-bShift-d(您也可以像退出 shell 一样退出Ctrl-d,但这意味着此tmux会话将被关闭,您将再次获得大量数字)。如果您在下载结束之前
意外关闭,将允许其在后台运行。但不要故意这样做,因为如果您在第一次下载未结束时运行第二个实例,可能会导致一些问题(至少与显示相关)。konsoletmuxtmux_in_konsole


笔记:我删除了评论的所有其他部分,因为它很混乱,而且我首先误解了你问题的一部分。我觉得还是有办法通过查看修改历史来查看的。如果需要的话,我还会在计算机上保存一份副本。
笔记:个人zsh快捷方式是Ctrl-Alt-l而不是Ctrl-l,如果你仍然看到第一个,这是我的粘贴错误。如果您看到此注释,也可能是我的粘贴错误! (但这一次,不是)

相关内容