AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 706717
Accepted
telometto
telometto
Asked: 2022-06-20 00:09:09 +0800 CST2022-06-20 00:09:09 +0800 CST 2022-06-20 00:09:09 +0800 CST

如何在 bash 中只重复命令的一部分?

  • 772

我想知道是否可以只重复命令的一部分。即如果我这样做ls /path/to/somewhere -a,我只想删除lsand -a。

我知道如果我这样做!!它会重复上一个命令(将最后一个命令附加到你之前写的任何命令)并且如果我这样做!$它包括字符串的最后一部分,但我想知道是否有可能重新- 仅使用前一个命令的例如中间部分。

linux bash
  • 4 4 个回答
  • 1874 Views

4 个回答

  • Voted
  1. Best Answer
    steve
    2022-06-20T01:18:20+08:002022-06-20T01:18:20+08:00

    当然,使用!^

    例如

    $ ls /path/to/somewhere -a
    ls: cannot access '/path/to/somewhere': No such file or directory
    $ echo !^
    echo /path/to/somewhere
    /path/to/somewhere
    $
    

    或者(导致额外的击键)您可以使用!:1.

    $ ls /path/to/somewhere -a
    ls: cannot access '/path/to/somewhere': No such file or directory
    $ echo !:1
    echo /path/to/somewhere
    /path/to/somewhere
    $
    

    这在手册页的“事件指示符”和“字指示符”部分中有完整记录。bash

    • 26
  2. bishop
    2022-06-20T21:00:00+08:002022-06-20T21:00:00+08:00

    扩展@steve 的回答以解决您的一般要求:

    我想知道是否可以仅重用上一个命令的例如中间部分。

    您可以使用多个单词范围来重新排列先前的命令:

    • !:x,要恢复第 x个单词,第一个单词是第 0个
    • !:x-y, 恢复第 x到第y个单词,包括

    例如:

    $ ls /foo /bar -a /baz >/dev/null 2>&1
    $ echo !:1-2 !:4
    echo /foo /bar /baz
    /foo /bar /baz
    

    请注意,重定向运算符算作单个单词,因此:

    $ ls /foo >/dev/null 2>&1
    $ echo !:3 !:2
    echo /dev/null >
    bash: syntax error near unexpected token `newline'
    

    可以进一步扩展按索引的单词选择以适用于最新命令以外的命令:

    • !-n, 选择第 n个最近的命令
    • !string, 选择最近的命令string

    因此,结合您可以获得的内容:

    $ cat /foo -vet >/dev/null 2>&1
    $ ls /bar -a >/dev/null 2>&1
    $ cp !cat:1 !ls:1-2 >/dev/null 2>&1
    cp /foo /bar -a
    

    我倾向于将命令历史视为一个数组——命令行、单词列——这使得这种导航变得自然。

    一个警告:通过缝合旧命令的一部分来制作新命令可能会导致命令具有不可逆转的效果。我建议放置:p一个参数来显示构建的命令,而不是调用它。

    例如:rm !ls:1-4:p。rm这将在插入最新命令的第 1 到第 4 个参数后打印最终命令ls。

    • 16
  3. 200_success
    2022-06-21T12:09:24+08:002022-06-21T12:09:24+08:00

    Bash 有一个yank-last-arg用于处理命令历史的命令:

    yank-last-arg (M-. 或 M-_)

    将最后一个参数插入上一个命令(上一个历史条目的最后一个字)。使用数字参数,行为与yank-nth-arg. 连续调用以yank-last-arg向后移动历史列表,依次插入每行的最后一个单词(或第一次调用的参数指定的单词)。提供给这些连续调用的任何数字参数都会确定在历史中移动的方向。否定参数会切换历史的方向(后退或前进)。历史扩展工具用于提取最后一个参数,就像!$指定了历史扩展一样。

    使用默认键绑定,您可以按 激活它Meta.。1 将最近命令的最后一个单词复制到光标所在的位置。

    要复制第n个单词而不是最后一个单词,请按Metan,然后按Meta.。

    我发现这比历史扩展更易于使用且不易出错,因为它是交互式工作的。


    另一种以交互方式调整先前命令的方法是使用该edit-and-execute-command功能:

    编辑和执行命令 (Cx Ce)

    在当前命令行上调用编辑器,并将结果作为 shell 命令执行。Bash 尝试按该顺序调用$VISUAL、$EDITOR和emacs作为编辑器。

    使用向上/向下箭头键调用命令,然后按CtrlX,CtrlE在$EDITOR. 然后您可以根据自己的喜好编辑命令,然后当您保存并退出编辑器时,它将执行。


    1根据您的键盘布局,Meta可能意味着按住某个Alt键、按住某个Option键或按下并释放该Esc键。The.是句号或句号,以防您在此处阅读有困难。

    • 5
  4. Ramon
    2022-06-24T10:53:43+08:002022-06-24T10:53:43+08:00

    向上箭头。然后backspace删除几个字符。Ctrl+A跳到行首,DEL删除一些字符。全程视觉反馈,无需猜测。Ctrl+E跳回行尾。

    • 0

相关问题

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • `tee` 和 `bash` 进程替换顺序

  • 通过标签将根文件系统传递给linux内核

  • 运行一个非常慢的脚本直到它成功

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve