sudo
シェルコマンドの前にとどまることはできません。シェルを呼び出して、そのコマンドを再度評価する必要があります(変数の展開、リダイレクト演算子用のファイルのオープンなど)。だから〜だ
sudo bash -c !!
ただし!!
、前のコマンドのテキスト、特殊文字、およびすべてを補間するため、これはまったく機能しません。コマンドのテキストを文字列として取得し、それを引数として渡す必要がありますsh
。幸いなことに、bashのfc
組み込み機能を使用すると、それを実行できます¹。
sudo bash -c "$(fc -ln -1)"
または、現在実行中のbashの同じバージョンを確実に呼び出すために:
sudo "$BASH" -c "$(fc -ln -1)"
コマンドは別のシェルプロセスで実行されるため、環境変数(sudo
心を保持するもののみ)を継承しますが、シェル内部変数は継承しないことに注意してください。シェルオプション(kshglob
)などの設定はデフォルトから開始されます。
ATTは、ksh93、両方の必要も同じcommand²は、zshのとkshので動作first
し、last
に渡す番号fc
:³を(さらにはbash、zshの及びpdkshの/ mkshで動作します)
sudo zsh -c "$(fc -ln -1)"
sudo ksh -c "$(fc -ln -1 -1)"
sudo "$0" -c "$(fc -ln -1 -1)"
$0
実行中のシェルの実行可能ファイルを指定するのに使用できるのは、シェルが$ PATHから呼び出され、$ PATHが変更されていない場合、または絶対パスから呼び出された場合のみです。
zshのもう1つの方法は、もう少し明確ですが、より長いものです。
sudo zsh -c $history[$[HISTCMD-1]]
警告の最後の言葉:sudo
潜在的に危険なコマンド用です。使いやすくしすぎないでください!
¹ 冒頭に余分な空白があり、コマンド置換は末尾の改行を取り除きますが、シェルの構文はそれを気にしません。
² 私はzshのとは思わないかkshがbashののようなものを持っています$BASH
。$0
絶対パスの場合、またはスラッシュが含まれておらず、コマンド検索パスが変更されていない場合にのみ機能します。
³ はATT kshのエイリアスですが、それでも同様です。 fc
hist