!! を使用して最後のコマンドを呼び出すコマンドのエイリアス

!! を使用して最後のコマンドを呼び出すコマンドのエイリアス

これは次の質問に対するフォローアップです

1つのsudoでコマンド行を実行する

同じコマンドを再度実行したい場合は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 として実行されることになります。これは、非常に悪いアイデアだと思います。特に、最も一般的なケースすべてで機能するものが完成するまでに、かなり複雑になる可能性が高いという事実を考慮すると、これは特に悪いアイデアです。

したがって、全体として、この種のことは何も試みないことをお勧めします。

関連情報