不能在脚本中使用 !$?

dai*_*isy 11 bash

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

#!/bin/bash 

ls /bin
ls !$
Run Code Online (Sandbox Code Playgroud)

我希望运行ls /bin两次,但第二次引发了!$未解释的错误

我错过了什么,还是!$只在命令行中工作?

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

cuo*_*glm 26

当 shell 以非交互方式运行时,默认情况下禁用历史记录历史记录扩展

你需要:

#!/bin/bash 

set -o history
set -o histexpand

ls /bin
ls !$
Run Code Online (Sandbox Code Playgroud)

或者:

SHELLOPTS=history:histexpand bash script.sh
Run Code Online (Sandbox Code Playgroud)

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

  • 小心 SHELLOPTS,它会影响运行 `script.sh` 的 `bash`,还会影响所有其他 `script.sh` 最终可能运行的 `bash` 实例(就像其他 `bash` 脚本......)。 (9认同)

Ste*_*nny 7

明智的做法是

ls /bin
ls $_
Run Code Online (Sandbox Code Playgroud)

或者

set ls /bin
$*
$*
Run Code Online (Sandbox Code Playgroud)

或者

c='ls /bin'
$c
$c
Run Code Online (Sandbox Code Playgroud)

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