2

これは、多くの人がよく使うだろうと私が考えたものの1つですが、この種のことについて書いた人を見つけることができないようです.

多くの場合、コマンドラインのワンライナーで多くの反復を行い、最終的にそれを頻繁に使用するようになったとき、または将来使用したいと予想したとき、または作業が面倒になったときに気づきました。一般的には、ワンライナーをシェル スクリプトに変換し、適切で簡単にアクセスできる~/bin.

これを行うために、テキスト エディターを含むあらゆる種類のラウンドアバウト メソッドを使用するのは明らかに面倒すぎます。たとえば、zsh の入力など、シェルで簡単に実行できます。

echo "#!/usr/bin/env sh" > ~/bin/command_from_history_number_523.sh && echo !523 >> ~/bin/command_from_history_number_523.sh

続いて、 を押してrd コマンドTabを挿入し、何らかの形でそれを受け入れ可能な文字列に押し込んで保存します。!523

これは特に面倒で、少なくとも 3 つの問題があります。

  • を完了しないため、bash では機能しません。!523
  • 手動検査と弦脱進機が必要
  • スクリプト名を 2 回入力する必要があるなど、入力が多すぎる

そのため、ここでメタ シェル スクリプトを実行する必要があるようです。

良い解決策は bash と zsh の両方で機能すると思います。おそらく、履歴コマンド番号の整数と、その 1 つのコマンドを含むハードコードされたディレクトリに出力するシェル スクリプトの名前の 2 つの引数を取ることで機能するはずです。さらに、bash の下では、複数行のコマンドが個別のコマンドとして扱われるように見えますが、ここでは 1 行のみを考慮し、この時点ではとにかく zsh のみを使用すると仮定します。

ここでの障害は、zsh を使用している場合でも、bash を介してシェル スクリプトを実行していると思われるため、zsh の履歴ファイルを解析できない可能性が高いことです。その場合、これを 2 つの別個のプログラムにする必要があるかもしれません。

更新: !! のようなコマンドを直接使用するという @Floris のコメントに同意します。これを機能させる方法がわかりませんが、役に立ちます。使用法が

mkscript command_number_24 !24

mkscript24 番目のコマンドの展開されたコンテンツを受信するため、これは不十分です。24 番目のコマンドにファイル グロブまたはそのようなものが含まれている場合、それらは既に展開されています。これは悪いことです。基本的に履歴ファイルの内容、つまり生のコマンド文字列が必要です。ここにこれらのショートカットを手動で実装することで、これを回避できると思います。または、それを台無しにして、整数の引数を取ります。

4

1 に答える 1

2
function mkscript() { 
    echo '#!/bin/bash' > ~/bin/$2
    history -p '!'$1 >> ~/bin/$2
}

Bash でのみテストされています。

OPからの更新:zshでは、これを達成できますfc -l $2 $2

于 2013-03-29T15:54:02.323 に答える