псевдоним для команды, использующий !! для вызова последней команды

псевдоним для команды, использующий !! для вызова последней команды

Это дополнительный вопрос к

Выполнить строку команд с помощью одного 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и потерпят неудачу).

Конечно, вы, возможно, сможете написать гораздо более сложную замену, которая могла бы разумно обработать все эти случаи, но это подводит меня к третьему пункту:

Это приведет к запуску команды от имени пользователя root без возможности просмотреть команду, которая будет выполнена, что кажется мне крайне плохой идеей, особенно учитывая тот факт, что к тому времени, когда у вас появится что-то, работающее даже во всех наиболее распространенных случаях, это, скорее всего, будет довольно сложным.

Так что, в общем и целом, я бы рекомендовал вам не пытаться делать ничего подобного.

Связанный контент