에 대한 후속 질문입니다.
동일한 명령을 다시 실행하려면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
.
이제 이러한 모든 경우를 합리적으로 처리할 수 있는 훨씬 더 복잡한 대체 코드를 작성할 수 있지만 이는 세 번째 요점으로 이어집니다.
이것은 곧 실행될 명령을 검토할 기회도 없이 루트로 명령을 실행하게 되는데, 이는 매우 나쁜 생각이라고 생각합니다. 가장 일반적인 경우에는 상당히 복잡할 것입니다.
그러므로 대체로 이런 종류의 일은 시도하지 않는 것이 좋습니다.