時には新しい(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
変更します。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()
~/.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を入力する方が高速です。