후속 질문입니다
같은 명령을 다시 실행하고 싶다면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
실패할 것입니다) 와 같은 일반적인 구문을 처리하지 않습니다 .
이제 이러한 모든 경우를 합리적으로 처리하는 더 복잡한 대체 코드를 작성할 수도 있지만 이는 세 번째 요점으로 이어집니다.
이렇게 하면 곧 실행될 명령을 볼 기회 없이 루트로 명령이 실행됩니다. 이는 제 생각에는 매우 나쁜 생각입니다. 특히 모든 명령에 적용되는 내용이 있을 때 가장 일반적이라는 사실을 고려하면 더욱 그렇습니다. 상황은 상당히 복잡할 수 있습니다.
그러므로 전반적으로 이와 같은 것은 시도하지 않는 것이 좋습니다.