从 bash shell 中先前执行的命令中调用所有参数

Posted

技术标签:

【中文标题】从 bash shell 中先前执行的命令中调用所有参数【英文标题】:Recall all arguments from a previously executed command in bash shell 【发布时间】:2019-12-17 02:23:46 【问题描述】:

这个link 给出了如何在命令行中调用最后一个成功执行的命令的参数的指针。

我想从 shell 历史中访问特定命令的所有参数。

对我来说只有这种语法有效

ls f1 f2 f3
file !ls:1-3 --> file f1 f2 f3

而且,如果我使用 !* 应该给出前一个命令的所有参数会抛出错误

file !ls:!*
-bash: !: unrecognized history modifier

我只能使用这种语法(即最后执行命令的所有参数。

file !*

上述方法的问题是,如果我使用某个选项执行了 ls,例如:ls -l,然后是 file 命令会抛出不同的输出,因为在这种情况下,ls 的选项将被视为第一个参数。

【问题讨论】:

all the arguments (part of argument list) - 不清楚。您想要所有参数还是参数列表的一部分?在ls -l file 命令中-l fileBash 理解中的参数。 啊,编辑并删除了“(参数列表的一部分)”部分。对困惑感到抱歉。这只是所有的论点 所有参数 但是如果你运行ls -l f1 f2 f3 你只想得到f1 f2 f3 而不是-l f1 f2 f3 对吧? -l 一个论点。 shell 不知道对待它与任何其他参数不同,ls 只是因为领先的- 而不同地对待它。 【参考方案1】:

尝试省略第二个!

$ ls foo bar baz
foo bar baz
$ echo !ls:*
echo foo bar baz
foo bar baz

【讨论】:

我不确定这如何回答 OP 的问题。如果你像 OP 一样使用 ls -l,你会在输出中得到 -l,而 OP 不希望这样。【参考方案2】:

!ls 返回最后一个ls 命令。如果你想要倒数第二个甚至更早的ls 执行,你可以使用history 来检索你想要的命令

history | grep ls

355  ls foo bar baz
446  ls -a
447  ls -ah

然后使用@Jon 解决方案或您的解决方案来获取争论

echo !355:*

【讨论】:

以上是关于从 bash shell 中先前执行的命令中调用所有参数的主要内容,如果未能解决你的问题,请参考以下文章

无法从 bash shell 脚本执行 Tcl 脚本

如何列出所有的 Bash Shell 内置命令 | Linux 中国

LINUX对shell命令的拦截

Linux shell 命令cd是怎么实现的?放在哪个文件夹?

Bash 如何在不同的目录上下文中执行命令?

Bash基础特性-命令历史