Это дополнительный вопрос к
Если вы хотите повторить ту же команду с помощью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 без возможности просмотреть команду, которая будет выполнена, что кажется мне крайне плохой идеей, особенно учитывая тот факт, что к тому времени, когда у вас появится что-то, работающее даже во всех наиболее распространенных случаях, это, скорее всего, будет довольно сложным.
Так что, в общем и целом, я бы рекомендовал вам не пытаться делать ничего подобного.