sudo
쉘 명령 앞에 붙일 수는 없으며 쉘을 호출하여 해당 명령을 다시 평가해야합니다 (변수 확장, 리디렉션 연산자를위한 파일 열기 등). 그래서 그건
sudo bash -c !!
!!
이전 명령의 텍스트, 특수 문자 및 모두를 보간 하기 때문에 이것은 작동하지 않습니다 . 명령 텍스트를 문자열로 검색하여 인수로 전달해야합니다 sh
. 다행히도 bash의 fc
내장 기능을 사용하면 해당 기능을 수행 할 수 있습니다 ¹.
sudo bash -c "$(fc -ln -1)"
또는 현재 실행중인 동일한 버전의 bash를 호출해야합니다.
sudo "$BASH" -c "$(fc -ln -1)"
명령은 별도의 셸 프로세스에서 실행되므로 환경 변수 ( sudo
유지 하는 변수 만)를 상속 하지만 셸 내부 변수 는 상속 하지 않습니다. 쉘 옵션 (예 :) kshglob
및 기타 설정도 기본값에서 시작됩니다.
동일한 명령 ²은 zsh 및 ksh에서 작동하지만 ATT ksh93은 first
및 last
숫자를 fc
³ (bash, zsh 및 pdksh / mksh에서도 작동) 로 전달해야합니다 .
sudo zsh -c "$(fc -ln -1)"
sudo ksh -c "$(fc -ln -1 -1)"
sudo "$0" -c "$(fc -ln -1 -1)"
$0
쉘이 $ PATH를 통해 호출되고 $ PATH가 변경되지 않았거나 절대 경로를 통해 실행되는 경우에만 실행중인 쉘의 실행 파일을 지정하는 데 사용 됩니다.
다음은 zsh의 또 다른 방법으로 약간 더 명확하지만 길었습니다.
sudo zsh -c $history[$[HISTCMD-1]]
경고의 마지막 단어 : sudo
잠재적으로 위험한 명령입니다. 너무 쉽게 사용하지 마십시오!
¹ 처음에는 여분의 공백이 있고 명령 대체는 끝에 줄 바꿈을 제거하지만 셸 구문은 신경 쓰지 않습니다.
² zsh 나 ksh는 bash와 같은 것이 없다고 생각합니다 $BASH
. $0
절대 경로이거나 슬래시가없고 명령 검색 경로가 변경되지 않은 경우에만 작동합니다.
³ 는 ATT ksh 의 별명 이지만 그 정도입니다. fc
hist