!!를 사용하는 명령의 별칭 마지막 명령을 기억하려면

!!를 사용하는 명령의 별칭 마지막 명령을 기억하려면

에 대한 후속 질문입니다.

하나의 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.

이제 이러한 모든 경우를 합리적으로 처리할 수 있는 훨씬 더 복잡한 대체 코드를 작성할 수 있지만 이는 세 번째 요점으로 이어집니다.

이것은 곧 실행될 명령을 검토할 기회도 없이 루트로 명령을 실행하게 되는데, 이는 매우 나쁜 생각이라고 생각합니다. 가장 일반적인 경우에는 상당히 복잡할 것입니다.

그러므로 대체로 이런 종류의 일은 시도하지 않는 것이 좋습니다.

관련 정보