只是想知道为什么这不起作用
#!/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 实例。
明智的做法是
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
命令结合使用)或使用"$@"
代替$*
来解决这些情况。
归档时间: |
|
查看次数: |
953 次 |
最近记录: |