sudoで前のコマンドを再実行します


8

コマンドを実行したいのですが、適切な権限がないため失敗します。次に、実行したコマンドをsudoするために「お願い」と書くことができます。

これが私がターミナルでしたいことです:

$ run command
"you don't have access to do that"
$ please
"ran successfully"

それが!!前のコマンドを取得するのを見たので、それを使用できると思ったのですが、それを機能させることができません。

私のplease.shシェルスクリプトは次のようになりますが、これらを機能させることができません。「コマンドが見つかりません!!」sudoの使用法を出力します。

#!/bin/zsh

#sudo !!
#sudo `!!`
sudo $(!!)

スクリプトなしで動作しますか?実行sudo !!しただけの場合、期待どおりに実行されますか?おもう !!単にbashエイリアスの可能性があるため、zshでは機能しない可能性があります
Chris Wayne

3
AFAIK、履歴拡張(!!およびその他)はインタラクティブシェルでのみ機能し、スクリプトでは機能しません。
トール

sudo !!対話モードでは、ほぼ期待どおりに動作します。Enterキーを押す!!と、前のコマンドに置き換わります。それを実行するには、もう一度Enterキーを押す必要がありました。
jb。

回答:


6

!!子シェルでは親シェルにアクセスできないため、シェルスクリプトでは使用できません。の使用をお勧めしsudo !!ますが、本当にBASHスクリプトを作成したい場合は、次のように.bash_historyを使用する必要があります。

#!/bin/bash
sudo `cat $HOME/.bash_history | tail -n1`

それは間違いなく完璧なソリューションではありませんが、トリックを行う必要があります。ZSHを使用している場合、ZSHは(私の知る限り).bash_historyに出力しないため、これは機能しません。 更新:ZSHで動作するバージョンは次のとおりです。

#!/usr/bin/zsh
. $HOME/.zshrc
sudo `cat \`readlink -f $HISTFILE\` | tail -n1`

お役に立てれば!

スクリプトがわからない場合は、BASHに最後に入力したコマンドをsudoで実行するだけです。


OK。私はzshを使っています。zshの.bash_historyに相当するものはありますか?
jb。

私が見たところ、はい、動作するはずのバージョンがあります。私はまだそれをテストしていません。
MiJyn 2012

bash履歴ファイルを直接読み取らないでください。fcまたはhistory組み込みを使用します。デフォルトでは、bashからログアウトするまで、$ HISTFILEは更新されません。
スティーブンK

24

.zshrcに追加:

alias please='sudo $(fc -ln -1)'

扱いやすさは、使いやすさのために上記の受け入れられた答えよりも良いようです。
Mitchell Currie、

2
好奇心が強い人のために:fc修正コマンドを表します。ドキュメントはこちらです。
dshepherd 2016年

ありがとうございました!私は、これはAskUbuntuですけど、私は、システムのクリップボードに私の最後のコマンドをコピーするにはOSX上で、これを使用:alias lastcmd="fc -ln -1 | pbcopy"(?):私は、これはUbuntuの上で動作するはずと考えていますalias lastcmd="fc -ln -1 | xclip -selection clipboard
HellaMad
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.