スクリプトで!$を使用できませんか?

スクリプトで!$を使用できませんか?

なぜこれがうまくいかないのだろうか。

#!/bin/bash 

ls /bin
ls !$

2回実行すると予想していましたが、ls /bin2回目には!$解釈されず、エラーが発生します。

何か抜けましたか?それとも!$コマンドラインでのみ機能しますか?

man bash(Macで)関連部分が見つかりません

答え1

歴史そして歴史的拡張シェルが非対話式で実行されると、デフォルトでは無効になります。

以下を行う必要があります。

#!/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コマンドとともに)または"$@"置換が必要になることがあります$*

関連情報