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 个回答 Voted 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 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。 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.是句号或句号,以防您在此处阅读有困难。 Ramon 2022-06-24T10:53:43+08:002022-06-24T10:53:43+08:00 向上箭头。然后backspace删除几个字符。Ctrl+A跳到行首,DEL删除一些字符。全程视觉反馈,无需猜测。Ctrl+E跳回行尾。
当然,使用
!^
例如
或者(导致额外的击键)您可以使用
!:1
.这在手册页的“事件指示符”和“字指示符”部分中有完整记录。
bash
扩展@steve 的回答以解决您的一般要求:
您可以使用多个单词范围来重新排列先前的命令:
!:x
,要恢复第 x个单词,第一个单词是第 0个!:x-y
, 恢复第 x到第y个单词,包括例如:
请注意,重定向运算符算作单个单词,因此:
可以进一步扩展按索引的单词选择以适用于最新命令以外的命令:
!-n
, 选择第 n个最近的命令!string
, 选择最近的命令string
因此,结合您可以获得的内容:
我倾向于将命令历史视为一个数组——命令行、单词列——这使得这种导航变得自然。
一个警告:通过缝合旧命令的一部分来制作新命令可能会导致命令具有不可逆转的效果。我建议放置
:p
一个参数来显示构建的命令,而不是调用它。例如:
rm !ls:1-4:p
。rm
这将在插入最新命令的第 1 到第 4 个参数后打印最终命令ls
。Bash 有一个
yank-last-arg
用于处理命令历史的命令:使用默认键绑定,您可以按 激活它Meta.。1 将最近命令的最后一个单词复制到光标所在的位置。
要复制第n个单词而不是最后一个单词,请按Metan,然后按Meta.。
我发现这比历史扩展更易于使用且不易出错,因为它是交互式工作的。
另一种以交互方式调整先前命令的方法是使用该
edit-and-execute-command
功能:使用向上/向下箭头键调用命令,然后按CtrlX,CtrlE在
$EDITOR
. 然后您可以根据自己的喜好编辑命令,然后当您保存并退出编辑器时,它将执行。1根据您的键盘布局,Meta可能意味着按住某个Alt键、按住某个Option键或按下并释放该Esc键。The.是句号或句号,以防您在此处阅读有困难。
向上箭头。然后
backspace
删除几个字符。Ctrl+A
跳到行首,DEL
删除一些字符。全程视觉反馈,无需猜测。Ctrl+E
跳回行尾。