如何在没有鼠标的情况下将整个命令行复制到剪贴板?

Val*_*lva 20 command-line keyboard clipboard

想象一下,我的终端中有这一行:

youtube-dl --get-thumbnail --extract-audio --audio-format mp3 https://www.youtube.com/watch?v=
Run Code Online (Sandbox Code Playgroud)

测试后,我想将上面的这一行复制到剪贴板并将其粘贴到某个脚本文件中。不是命令的输出。但是,在不使用鼠标的情况下执行此操作。我只喜欢把手放在键盘上。我认为那样更快,做一些编码:)

Byt*_*der 22

我的回答提供了三种不同语法的简单命令,它们都同样有效,但一种比第二种更短且更易于键入。第三种变体是所谓的别名,这意味着您可以为命令分配一个自定义名称并通过执行该名称来调用它,而无需记住复杂的内容。

准备:

首先,安装xsel允许您从终端访问 X 剪贴板的软件包:

sudo apt-get install xsel
Run Code Online (Sandbox Code Playgroud)

命令变体 1(短):

之后,您可以键入以下行将上一个命令复制到剪贴板:

xsel -ib <<<!!:q
Run Code Online (Sandbox Code Playgroud)

如果要复制第二个最新的命令,请替换!!!-2, 以供第三个最新使用!-3,依此类推。

为了解释您正在运行的内容,这里对命令进行了简短的分解:

  • xsel是一个用于访问 X 剪贴板的命令行工具。
    有关更多信息,请在线阅读它的联机帮助页联机帮助页图标或通过运行man xsel.

    • -i参数告诉xsel从标准输入读取(通常这意味着键盘输入,但是我们在这里要重定向的东西)
    • -b参数指定使用剪贴板而不是 X 的“主要”或“次要”选择。
  • <<<是一种特殊的 Bash 语法,称为“Here String”。
    它基本上扩展(不计算!)参数(只有一个!),并将其作为字符串重定向到它所在的命令之前/之后的标准输入(标准输入)。

  • !!:q在 bash 中被称为用于历史扩展的“bang 命令”。它用任何以前键入的命令行替换自己。
    有关更多信息,请通过运行阅读它的本地联机帮助页man history(在线联机帮助页没有帮助)。

    • The!!代表前一个命令行,是!-1.
      显然!-2意味着然后倒数第二个命令行。不要忘记减号-,否则它将返回您输入的第二个(第三个/...)命令。
    • :q修改的砰命令并告诉bash中以封闭在单引号的取代('),以防止由所述壳进一步扩展。

命令变体 2(稍长):

echo !!:q | xsel -ib
Run Code Online (Sandbox Code Playgroud)
  • echo 具有将所有参数打印到终端的标准输出的简单工作。

  • !!:q在 bash 中被称为用于历史扩展的“bang 命令”。它用任何以前键入的命令行替换自己。

    • The!!代表前一个命令行,是!-1. 显然!-2意味着然后倒数第二个命令行。不要忘记减号-,否则它将返回您输入的第二个(第三个/...)命令。
    • :q修改的砰命令并告诉bash中以封闭在单引号的取代('),以防止由所述壳进一步扩展。
  • |是一个管道。它将之前命令的终端输出(“stdout”)重定向到之后命令的终端输入(“stdin”)。

  • xsel是一个用于访问 X 剪贴板的命令行工具。
    有关更多信息,请在线阅读它的联机帮助页联机帮助页图标或通过运行man xsel.

    • -i参数告诉xsel从标准输入读取(通常这意味着键盘输入,但是我们在这里要重定向的东西)
    • -b参数指定使用剪贴板而不是 X 的“主要”或“次要”选择。

命令变体 3(别名):

如果您不想记住经常使用的冗长或复杂的命令,那么 bash 别名是一件很酷的事情。您可以将此命令分配给一个简单的别名,您可以运行该别名而不是长命令来实现相同的目的。

不幸的是,由于 bang 命令是一种特殊的 Bash 功能,并且在解析别名之前会被扩展,因此您不能简单地为上述变体之一设置别名,因为该!!部分将不起作用。不过有一个解决方法。

要设置别名,请在终端中运行以下行。请注意,您可以选择任何有效的 Bash 变量名称而不是copylastcommand

alias copylastcommand='history -p \!\! | xsel -ib'
Run Code Online (Sandbox Code Playgroud)

然而,这仅对您当前的 Bash 会话是持久的,这意味着在您关闭终端窗口后别名将消失。您可以通过将上面的这一行添加到您的~/.bashrc文件的末尾,或者在您的~/.bash_aliases文件中(如果有的话)添加到您的每个 Bash 会话中,使其持久化。

再次,对这条线的简短分解:

  • alias name='command'是在 Bash 中设置别名的语法。在command每当你执行将运行name从现在开始。

  • history -p \!\!将先前执行的命令行输出到 stdout(标准输出)。如果没有-p开关,它不仅会打印,还会再次运行命令。
    请注意,我们需要!使用反斜杠 ( \)对刘海 ( ) 进行转义,否则当我们尝试设置别名时 bash 会扩展它们,这是没有意义的,因为它们需要按原样位于别名中。
    同样,您还可以通过将第二个 bang 替换为-n,例如来指定第 [n] 个最近的命令\!-2

  • |是一个管道。它将它之前命令的标准输出(“stdout”)重定向到它之后命令的终端标准(“stdin”)。

  • xsel是一个用于访问 X 剪贴板的命令行工具。
    有关更多信息,请在线阅读它的联机帮助页联机帮助页图标或通过运行man xsel.

    • -i参数告诉xsel从标准输入读取(通常这意味着键盘输入,但是我们在这里要重定向的东西)
    • -b参数指定使用剪贴板而不是 X 的“主要”或“次要”选择。


hee*_*ayl 5

您可以使用xclip

some_command | xclip -selection c
Run Code Online (Sandbox Code Playgroud)

所以在你的情况下:

youtube-dl .... | xclip -selection c
Run Code Online (Sandbox Code Playgroud)

c 代表剪贴板。

您可能需要先安装xclip

sudo apt-get install xclip
Run Code Online (Sandbox Code Playgroud)

编辑:

如果您只想将您输入的命令(而不是输出)复制到剪贴板,您可以使用 Here 字符串:

 xclip -selection c <<<"$(echo foobar)"
Run Code Online (Sandbox Code Playgroud)

或管道:

echo foobar | xclip -selection c
Run Code Online (Sandbox Code Playgroud)