コマンドラインの尾からテキストを実行する最も簡単な方法は何ですか?

コマンドラインの尾からテキストを実行する最も簡単な方法は何ですか?

時には新しい(Ubuntu)ボックスで開発中ですが、次のように入力すると警告がgit表示されます。

The program 'git' is currently not installed.  You can install it by typing:
apt-get install git-core

このような場合は、次のようにして最後の行を取得できることを知っています。

!! 2>&1 | tail -n 1

apt-get install git-coreしかし、()の結果を最も簡単に実行する方法は何ですか?

私ができることに気づいた

`!! 2>&1 | tail -n 1`

しかし、実際に出力をパイプして実行する方法もありますか?これはうまくいかないようです:

!! 2>&1 | tail -n 1 | sh

そして、この2>&1部分が少し面倒ですが、もっと簡単にする方法がないかと思います。

編集する

どういうわけか変数に保存し、その変数で実行することも許可されます。

!! 2>&1 | tail -n 1 | (store as $mycmd)
$mycmd

stdoutしかし、少なくともコマンドの右側に変数をパイプする方法があるかどうかはわかりません。

答え1

bashは、システムに存在しないコマンドを入力すると機能を実行しますcommand_not_found_handle()。この関数は/usr/lib/command-not-foundメッセージを印刷するスクリプトを呼び出します。

Ubuntu12.04

私の最初の推測は、メッセージを印刷するためにこのスクリプトのソースを変更することでしたが、stdoutスクリプトstderrのソースを読んだときに不足しているパッケージをインストールするかどうかを尋ねるように設定できることがわかりました。

変数をエクスポートすると、COMMAND_NOT_FOUND_INSTALL_PROMPT不足しているパッケージをインストールするように求められます。

pbm@ubuntu:~$ git
The program 'git' is currently not installed.  You can install it by typing:
sudo apt-get install git
pbm@ubuntu:~$ export COMMAND_NOT_FOUND_INSTALL_PROMPT=""
pbm@ubuntu:~$ git
The program 'git' is currently not installed.  You can install it by typing:
sudo apt-get install git
Do you want to install it? (N/y)y
sudo apt-get install git
[sudo] password for pbm: 

以前のバージョンのUbuntu

残念ながらいいえ、COMMAND_NOT_FOUND_INSTALL_PROMPT他のオプションを見つけることができます。

1)12.04でパッケージをインストールする - 問題はありません。 Pythonのスクリプトはほんの一部ですので、うまく動作します(テストされていません!)。

2)stderrに変更しますstdout。これを行うには、ファイルを編集して237行と240行に/usr/lib/python2.7/dist-packages/CommandNotFound/CommandNotFound.py変更します。stderrstdout

その後、次のように使用できます。

pbm@ubuntu:~$ git
The program 'git' is currently not installed.  You can install it by typing:
sudo apt-get install git
pbm@ubuntu:~$ `git`
//Installation begins

237行と240行の-yコマンドにオプションを追加する場合は、apt-get構文を使用することもできます!! | sh

3)242行目からこのスクリプトを変更することもできます。

print >> sys.stderr, _("You can install it by typing:")
f = open("%s/.install-missing" % os.path.expanduser('~'),'w')
print >> sys.stderr, "sudo apt-get install %s" % packages[0][0]
print >> f, "sudo apt-get install %s" % packages[0][0]
f.close()

~/.install-missingこれにより、エイリアスを作成できるようにファイルにコマンドが表示されます。

alias im="chmod +x ~/.install-missing; ~/.install-missing"

パッケージを呼び出すとインストールされimます。

答え2

あなたは正しい道を行っています:

!! 2>&1 | tail -n 1 | sh

...しかし、選択の余地はありませんシェン。考慮する:

!! 2>&1 | tail -n 1 | sh -s

apt-get を実行するには root アクセスが必要な場合があるため、次の点を考慮してください。

!! 2>&1 | tail -n 1 | sudo sh -s

答え3

次のことができます。

!! 2>&1 | tail -n 1 > /tmp/cmd; bash /tmp/cmd; rm /tmp/cmd

インタラクティブプログラムは入力(この場合は「Y」)を必要とするため、パイプとうまく機能しないようですが、最初のコマンドが終了するとstdinファイル記述子が閉じます。

答え4

私は変数とコマンドの置換を使うことができると思いますeval(これがどれほど安全かはわかりません)。

TEST_VAR=$(!! 2>&1 | tail -n 1); eval $TEST_VAR

私は間違っていることを証明したいと思います。 bash 完了 自動提案の代わりにコマンドを使用して Red Hat システムでこれをテストしていますが、echo原則は同じでなければなりません。

結局のところ、aptitude install gitを入力する方が高速です。

関連情報