我经常
在终端中编写我不记得的命令,然后
在按 之前,从剪贴板粘贴一些路径或文件名Enter。
我以为这会很有趣用一个快捷方式完成第一部分然后粘贴即可,通过关键操作实现上述目的。
基于这个答案在“如何分配某个键盘快捷键来粘贴特定项目?”,我添加了一个快捷方式bash -c "xsel -ib <<< 'MY_COMMAND'"
,它将命令发送到剪贴板。但是,当将其粘贴到终端时,该命令会自动执行,因为末尾有一个“Enter”(换行符):
[这是在 Kubuntu 20.04 中。]
答案1
基于回答“如何避免 xsel 将文本发送到剪贴板(末尾带有空格/回车)”我现在有一个解决方法。我不知道如何启动终端并在其中等待新输入(键入、粘贴)的文本,只需一个动作(脚本/命令/快捷方式)但现在我可以这样做二脚步:
- 使用与 关联的快捷方式
bash -c 'printf "%s" "MY_TEXT" | xsel -b' ; konsole
将该文本发送到剪贴板并打开一个终端,例如konsole
- 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_COMMAND
gnome-terminal -- MY_COMMAND
这个帖子它完全解决了问题(除了它仅适用于gnome-terminal
和xterm
,因此可能有也可能没有类似的解决方案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
,konsole
和youtube-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
会话将被关闭,您将再次获得大量数字)。如果您在下载结束之前
意外关闭,将允许其在后台运行。但不要故意这样做,因为如果您在第一次下载未结束时运行第二个实例,可能会导致一些问题(至少与显示相关)。konsole
tmux
tmux_in_konsole
笔记:我删除了评论的所有其他部分,因为它很混乱,而且我首先误解了你问题的一部分。我觉得还是有办法通过查看修改历史来查看的。如果需要的话,我还会在计算机上保存一份副本。
笔记:个人zsh
快捷方式是Ctrl-Alt-l而不是Ctrl-l,如果你仍然看到第一个,这是我的粘贴错误。如果您看到此注释,也可能是我的粘贴错误! (但这一次,不是)