bashの履歴コマンドのパラメータ


shellコマンドを実行するときには、前のコマンドのパラメータを使用する必要があります.パラメータが簡単な場合は、繰り返し入力することでニーズを満たすことができます.パラメータが長い場合や、パラメータの数が多い場合は、履歴コマンドのパラメータを再利用すれば、半分の効果が得られます.履歴コマンドのパラメータを取得する3つの方法について説明します.
1、readlineショートカットで実現
Readlineは強力なライブラリであり、bash、ftp、python、zsh、mysqlなどのプログラムのコマンドラインインタフェースはreadlineを使用して実現されています.実際、私たちがよく使うctrl-r(履歴検索コマンド)、ctrl-p(前の履歴コマンド)、ctrl-a(行頭にジャンプ)などのショートカットキーはbashでは実現されず、その背後の功労者はreadlineです.
alt-dot(altキー+.キー)、esc-dotを入力(ESCキー+.キー)、meta-dotは、前のコマンドの最後のパラメータを得ることができます.readlineでは、前のコマンドの他のパラメータを得ることができますが、これらのショートカットキーはリモートログインツールと競合することが多く、TERMタイプを個別に設定する必要があるため、ここでは説明しません.これらのショートカットキーについてはreadline shortcutsとここを参照してください.
2、通过$インプリメンテーション
$_前のコマンドの最後のパラメータが$、$と保存されています.など同様にbashの内蔵変数と考えられる.$_を利用して、ディレクトリにcdを作成して実装するには、次のようにします.
   1: makedir dir && cd "$_"

$_履歴コマンドに入ります.historyコマンドを実行すると、前に入力した$が表示されます.この後述するbashの歴史展開には著しい違いがある.
ちなみにpython shellでは前の式の結果を表す意味もあります.
3、bash歴史展開(history expand)により実現
bash履歴展開を使用する場合、!$前のコマンドの最後のパラメータを取得します.bash履歴展開は,どのコマンドを展開するか,そのコマンドのどのパラメータを展開するか,コマンドに対する操作をそれぞれ示すコマンド,パラメータ,オペレータの3つの部分から構成される.コマンド展開が完了してから入る.bash_historyでは、historyコマンドを実行しても履歴展開に使用されるパラメータは表示されません.
このセクションのすべてのコマンドは、現在のbashに次のような履歴があると仮定します.
neoli@ISD32_54_sles10:~/tmp/123$ history 1  2012-09-21 20:54:55 echo 1 2 3 4 5 2  2012-09-21 20:55:08 ls 6 7 8 9 10 3  2012-09-21 20:55:15 echo 11 12 13 14 15 4  2012-09-21 20:55:22 cat 16 17 18 19 20 5  2012-09-21 20:55:27 echo 21 22 23 24 25
1)コマンド部分はbashでEvent Designatorsと呼ばれ、一般的に使われています!歴史の展開を開始します.
  • !nはn番目のコマンドを表します.例えば!2実行ls 6 7 8 9 10
  • を示す
  • !-nは最後からn番目のコマンドを表します.例えば!-3はecho 11 12 13 14 15
  • を実行することを示す.
  • !!前のコマンドを表します.-1のショートカット
  • !stringはstringで始まる最近のコマンドを表します.例えば!echo表示echo 21 22 23 24 25
  • !?string?stringを含む最近のコマンドを表します.例えば!?6?表示cat 16 17 18 19 20
  • ^string 1^string 2^は、前のコマンドを実行し、最初のstring 1をstring 2に置き換え、string 1が存在しない場合は置き換えに失敗し、コマンドは実行されません.
  • !#現在のコマンドが入力されている部分を示します.echo 1 2などです.echo 1 2 echo 1 2
  • が実行されます.
    2)コマンドから指定されたパラメータを選択するためのパラメータ部分(Word Designators):コマンド部分とパラメータ部分を分割するためのパラメータ部分.
  • !!:0は前のコマンドの0番目のパラメータ、すなわちコマンド自体を表し、echo
  • を得る
  • !2:nは2番目のコマンドのn番目のパラメータを表します.例えば!2:2で得られたのは7
  • !!:^前のコマンドの1番目のパラメータを表します.と!:1同義、得られたのは21
  • !!:$前のコマンドの最後のパラメータを表し、さらに!$と略記できます.得られたのは25
  • !!:x-yはx番目からy番目のパラメータを表し、-yは0-yを意味し、例えば!-2:3-4で得られたのは18 19
  • !!:*前のコマンドを表すパラメータの部分は、さらに略して!*と書くことができます.如!:*得られたのは21 22 23 24 25
  • !!:n*と!!:n-$同義
  • !!:n-意为!!n-$-1、n番目のパラメータから最後から2番目のパラメータまで、例えば!-2:3-得られたのは18 19
  • bash履歴展開によるディレクトリへの作成とcdの実装方法は、次のとおりです.
       1: mkdir dir && cd !#:1

    そのうち!「mkdir dir&&cd」を表し、最初のパラメータをとるとディレクトリ名が得られます.
    3)オペレータ(Modifiers)オプションのパラメータセクションの後に、1つ以上の使用を指定できます:開始オペレータ
  • h最後のファイルパス部分を除去し、前のコマンドecho/tmp/123/456/を仮定すると、cd!:1:h:hはcd/tmp/123を意味する.前のコマンドecho/tmp/123/456を仮定すると、cd!:1:h:hはcd/tmp
  • を意味する
  • tすべての開始ファイルパス部分を除去し、前のコマンドがecho/tmp/123/456/であると仮定すると、cd!:1:tはcdを意味する.前のコマンドがecho/tmp/123/456であると仮定すると、cd!:1:tはcd 456
  • を意味する
  • r接尾辞を除去し、前のコマンドがecho/tmp/bbsであると仮定する.c,則echo!:1:rはecho/tmp/bbs
  • を意味する
  • e接尾辞が得られ、前のコマンドがecho/tmp/bbsであると仮定する.c,則echo!:1:eはechoを意味する.c
  • p printコマンド実行せず
  • [g]s/string 1/sting 2/コマンドのstring 1をstring 2に置き換え、gはグローバル置換を意味し、前のコマンドがecho 1 2 1であると仮定すると!:gs/1/3/はecho 3 2 3を意味する.3.1の^string 1^string 2^は!!:s/string1/string2/
  • [g]&は、前回の置換を実行することを意味し、gはグローバル置換を意味する.次に、前のコマンドがecho 123451であると仮定すると!:&echo 323451