Can't use !$ in script?
History and history expansion are disabled by default when the shell run non-interactively.
#!/bin/bash set -o history set -o histexpand ls /bin ls !$
SHELLOPTS=history:histexpand bash script.sh
it will affect all bash instances that
script.sh may run.
The sane thing to do would be
ls /bin ls $_
set ls /bin $* $*
c='ls /bin' $c $c
Caveats: it's worth remembering that each of these comes with some pitfalls. The $_ solution only captures the last single argument: so
ls foo bar will leave $_ containing just
bar. The one using
set will override the arguments (
$2, etc). And all of these as written will work, but when generalized to more complex commands (where escaping and whitespace matter), you could run into some difficulties. For example:
ls 'foo bar' (where the single pathname argument
foo bar contains two or more spaces, or any other whitespace characters) is not going to behave correctly in either of these examples. Proper escaping (possibly combined with an
eval command), or using
"$@" instead of
$*, might be needed to get around those cases.