无法在脚本中使用 !$ ?

无法在脚本中使用 !$ ?

只是想知道为什么这不起作用

#!/bin/bash 

ls /bin
ls !$

我预计会运行ls /bin两次,但第二次会引发错误,因为!$未解释

我是否错过了什么,或者!$只能在命令行中工作?

man bash我在(在 mac 上)中找不到相关部分

答案1

历史历史扩展当 shell 非交互运行时,默认情况下禁用。

你需要:

#!/bin/bash 

set -o history
set -o histexpand

ls /bin
ls !$

或者:

SHELLOPTS=history:histexpand bash script.sh

它将影响所有script.sh可能运行的 bash 实例。

答案2

明智的做法是

ls /bin
ls $_

或者

set ls /bin
$*
$*

或者

c='ls /bin'
$c
$c

注意事项:值得记住的是,每种方法都存在一些陷阱。 $_ 解决方案仅捕获最后一个参数:因此ls foo bar$_ 只包含bar.使用的set将覆盖参数($1$2等)。所有这些编写的内容都可以工作,但是当推广到更复杂的命令(其中转义和空格很重要)时,您可能会遇到一些困难。例如:(ls 'foo bar'其中单个路径名参数foo bar包含或更多空格,或任何其他空白字符)在这两个示例中都不会正确运行。可能需要适当的转义(可能与eval命令结合使用)或使用"$@"代替 来$*解决这些情况。

相关内容