これは次の質問に対するフォローアップです
同じコマンドを再度実行したい場合はsudo !!
次のようなコマンドを実行した後:
echo "something">/path/file
グローバル置換構文を使用してコマンドを呼び出すことができます。
!!:gs/>/|sudo tee -a /
の後にスペースを入れてください-あパラメータ。
これは次のものと同等であるすどう!!ただし、< および > の sudo 制限を回避するのに役立ちます。sudo では [<, >] の使用が許可されていないためです。
これをエイリアスに入れて.bashrc
簡単に使用するにはどうすればよいですか?
私は試した
alias redo='!!:gs/>/|sudo tee -a /'
しかし、これは機能せず、次のエラーが発生します:
$ echo "sdfdsf">/path/file
bash: /path/file: no permissions
$ redo
bash: /: Is a directory
tee: /: Is a directory
答え1
あなたが探しているのは次のものだと思います:
sudo sh -c "!!"
!!
これは最後のコマンドに変換され、シェルのリダイレクト/パイプ/変数が機能し続けます。
➜ ~ ping 10.0.0.1
--- 10.0.0.1 ping statistics ---
6 packets transmitted, 3 received, 50% packet loss, time 5001ms
rtt min/avg/max/mdev = 1.736/1.951/2.182/0.185 ms
➜ ~ sudo sh -c "!!" ## And becomes like this:
➜ ~ sudo sh -c "ping 10.0.0.1"
答え2
質問に対する正確な答えではありませんが、これを行わないでください。
このエイリアスの背後にある考え方は (それが機能すると仮定して)>
を に変換する|tee -a foo
のが良い考えだということです。まず、最良の場合でも、それらは同等ではありません。 >
はファイルを上書きし、tee -a
は追加します。
echo >>foo
第二に、これは(に変換されてecho |sudo tee -a |sudo tee -a foo
失敗する) やecho 2>&1
(に変換されてecho 2|sudo tee -a &1
失敗する)のような一般的な構造を処理しません。
さて、これらすべてのケースを適切に処理できる、はるかに複雑な置換を記述できるかもしれませんが、それが私の 3 番目のポイントにつながります。
これにより、実行しようとしているコマンドを確認する機会がないまま、コマンドが root として実行されることになります。これは、非常に悪いアイデアだと思います。特に、最も一般的なケースすべてで機能するものが完成するまでに、かなり複雑になる可能性が高いという事実を考慮すると、これは特に悪いアイデアです。
したがって、全体として、この種のことは何も試みないことをお勧めします。