永続シェルパラメータ

永続シェルパラメータ

私はしばしば一連のパラメータに対して一連のコマンドを実行する自分自身を見つけます。

たとえば、

$ nmap -Pn -sS 192.168.1.5
$ ssh 192.168.1.5
$ curl 192.168.1.5
$ wget -r 192.168.1.5

パラメータを変数に入れて作業を高速化できます。

$ a=192.168.1.5
$ nmap -Pn -sS $a
$ ssh $a
$ curl $a
$ wget -r $a

次のようないくつかの機能を使用して速度をさらに向上させます。

$ more .zshrc
...
paa() { PERSIST_ARGS+=("$@"); }
pa() { eval "$@" "${PERSIST_ARGS[@]}"; }
...
$ paa 192.168.1.5
$ pa nmap -Pn -sS
$ pa ssh
$ pa curl
$ pa wget -r

スピードを上げる方法はありますか?例えば、

$ <start special mode> 192.168.1.5
$ nmap -Pn -sS
$ ssh
$ curl
$ wget -r
$ <exit special mode>

bashまたはzsh解決策を探しています。ソリューションはすべてのコマンドセットを使用する必要があります。

答え1

Alt-_最後のコマンドの最後の単語が挿入されました。私にとってはこれで十分でしたが、スペース、最後の単語、および行を許可する(Enter)を挿入するために別のキーバインディングを追加できます。

そしてtcshまたはzsh(についてAlt-SSについてsame):

bindkey -s '\es' ' \e_\r'

そしてbash

bind '"\es": " \e_\r"'

次に、次のように入力します。

$ nmap -Pn -sS 192.168.1.5
$ ssh<Alt-S>
$ curl<Alt-S>
...

と少なくともzshtcsh数値引数(つまり、前に追加するとAlt-<number>)スペース文字に適用されます。これはあまり役に立ちません(Alt-3Alt-S3つのスペースを挿入し、最後の単語を一度挿入して行を許可します)。次のいずれかを挿入すると便利です。N最後のコマンドの最後の単語、またはN最後のコマンドまたは最後N最後のコマンドの単語です。

少なくともzshマクロを使用する代わりに、新しいウィジェットを定義できます。たとえば、

use-last-word() {
  LBUFFER+=" "
  zle insert-last-word
  zle accept-line
}

zle -N use-last-word
bindkey '\es' use-last-word

Alt-3Alt-S最後のコマンドの最後の3番目の単語が挿入されます

最後から3番目のコマンドに最後の単語を挿入するには、次のようにします。

use-last-word() { 
  LBUFFER+=" "
  local n=$NUMERIC
  unset NUMERIC
  repeat ${n:-1} zle insert-last-word
  zle accept-line
}

最後のコマンドの最後の3単語を挿入するには:

use-last-word() { 
  for ((NUMERIC=${NUMERIC:-1}; NUMERIC; NUMERIC--)) {
    LBUFFER+=" "; zle insert-last-word
  }
  zle accept-line
}

答え2

私自身の質問にこう答えるのは気分が悪いですが、解決策があります。

pst() {
    [ $# = 0 ] && return 1

    if [ -n $ZSH_VERSION ]; then
        local read=vared
    else
        local read=read
    fi

    local cmd
    local -a args
    args=("$@")
    while $read -p '> ' cmd ; do
        test -z "$cmd" && continue
        $cmd "${args[@]}"
    done
}

仕組みは次のとおりです。

$ pst 192.168.1.5
> nmap -Pn -sS
> ssh
> curl
> wget -r

この問題はしばらく遅れていて、より良い解決策があるかどうかを見てみましょう。この解決策の1つの主な欠点は、実行される命令が記録されないことである。

答え3

まだ同様のものを実装していませんが、シェルが提供する2つの機能を利用できるかどうか疑問に思います。 $PATH とコマンド補完。

「特殊モード」の場合は、タブの完成などの機能を提供できますが、繰り返しクリックするのではなく、nm(nmapの場合)を実行する実際のコマンドの数文字を入力してから、タブと同様のキーの組み合わせをクリックします。 、これまでに入力したものと一致する実行可能ファイルを見つけるために$ PATHを照会し、次のリストを返します。

私は次のように入力します:

$ pst 192.168.1.5
> nm <press SHIFT-TAB>

私は次のリストを受け取りました:

1* - nmap 192.168.1.5    2 - nmap2 192.168.1.5    3 - nmap3 192.168.1.5

メモ:上記のリストは私のクエリに関連しています$PATH

上記のリストでEnterを押すと、最初の応答(1 *)を受け入れるか、使用したい一致する番号を入力できます。

>> 2 <press ENTER>

また、このツールを bash やその他のシェルに統合して、指定された引数の型を受け入れる一致のみが一致で考慮されるように一致をcomplete絞り込むこともできます。pst <arg>

関連情報