なぜこれがうまくいかないのだろうか。
#!/bin/bash
ls /bin
ls !$
2回実行すると予想していましたが、ls /bin
2回目には!$
解釈されず、エラーが発生します。
何か抜けましたか?それとも!$
コマンドラインでのみ機能しますか?
man bash
(Macで)関連部分が見つかりません
答え1
答え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
コマンドとともに)または"$@"
置換が必要になることがあります$*
。