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


10

新しい(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、少なくとも変数がコマンドの右側にある場合を除いて、変数にパイプする方法もわかりません。

回答:


8

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

Ubuntu 12.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)に変更stderrstdoutます。これを行うには、ファイル/usr/lib/python2.7/dist-packages/CommandNotFound/CommandNotFound.pyを編集して237行目と240行目をに変更stderrしますstdout

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

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()

このようにして、コマンドをfileに取得する~/.install-missingため、エイリアスを作成できます。

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

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


うーん、これは本当に良さそうに見えましたが、実際には11.10のoneiricでは機能していないようです/usr/lib/command-not-foundが、参照はありませんCOMMAND_NOT_FOUND_INSTALL_PROMPT-考えですか?
cwd 2012

わかりました、これは12.04の一部となる機能です(package-import.ubuntu.com/diffs/command-not-found)。以前のバージョンのソリューションがまだ必要だと思います。
cwd 2012

@cwd:私は私の回答を更新しました...
pbm

3

あなたは正しい軌道に乗っていました:

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

...しかし、shのオプションがありません。検討してください:

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

また、apt-getを実行するにはrootアクセスが必要になる可能性があるため、以下を検討してください。

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

これは機能しません。shとsh -sは、少なくともこの場合は同じことを行います。
Deepak Mittal

1

あなたはこのようなことをすることができます:

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

対話型プログラムは入力(この場合は 'Y')を想定しているため、パイピングではうまく機能しないようですが、stdinファイル記述子は、最初のコマンドが終了するとすぐに閉じられます。


0

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

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

私は上記で間違っていると証明されても構わないと思っています。Red Hatマシンで、echobashの補完の自動提案ではなくコマンドを使用してこれをテストしていますが、原則は同じです。

結局のところ、aptitude install gitと入力する方が速いでしょう...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.