sudo는 간단한 명령에만 작동합니까?

sudo는 간단한 명령에만 작동합니까?

sudo 간단한 명령에만 해당되나요? 아래 예를 보면 그럴 것 같습니다. 내 말이 맞나요?

$  if true; then echo hello; fi
hello

$ sudo if true; then echo hello; fi
bash: syntax error near unexpected token `then'

$ sudo ( if true; then echo hello; fi )
bash: syntax error near unexpected token `if'

$ sudo "if true; then echo hello; fi"
[sudo] password for t: 
sudo: if true; then echo hello; fi: command not found

$ sudo " ( if true; then echo hello; fi ) "
sudo:  ( if true; then echo hello; fi ) : command not found

하지만 이 예를 보면 잘 모르겠습니다.

$ sudo time echo hello
hello
0.00user 0.00system 0:00.00elapsed 100%CPU (0avgtext+0avgdata 1924maxresident)k
0inputs+0outputs (0major+71minor)pagefaults 0swaps

time echo hello 간단한 명령 인가요 ? time명령어 이름이 아니라 키워드이기 때문에 그렇게 생각하지 않습니다 .

감사해요.

답변1

sudo전체 "간단한 명령" 구문도 지원되지 않습니다. Bash 매뉴얼 페이지의 Shell Grammar 섹션에 따르면:

간단한 명령일련의 선택적 변수 할당이며 그 뒤에는공백- 단어를 분리하고 다음으로 리디렉션합니다.제어 연산자.

즉, 간단한 명령은 다음과 같습니다.

LC_ALL=C grep -i "keyword" <infile >outfile &

sudo변수 할당(예: LC_ALL=C), 명령 이름 및 해당 매개변수(예: grep -i "keyword")는 지원되지만확실히리디렉션(예: <infile >outfile) 또는 제어 연산자( &)를 지원합니다. 실제로 sudo다음과 같이 지원되지 않는 요소를 사용하려고 하면:

sudo LC_ALL=C grep -i "keyword" <infile >outfile &

...그러면 쉘은 &리디렉션과 background()를 실행하기 전에 이를 해석 sudo하고 이를 sudo( grep간접적으로 명령이 아닌 명령이 아닌) 자체에 적용합니다.

지원되지 않는 기타 sudo: 파이프, 목록( ;또는 로 구분된 여러 명령 ) &, 명령 그룹( ( )또는 포함 { }), 조건 및 산술 표현식( [[ ]](( ))), 논리 연산자( !, &&||), 키워드( if, for, whilecase) 또는 쉘 별칭 및 함수.

time이는 쉘 키워드이기 때문에 흥미로운 예입니다.그리고일반 명령(보통 /usr/bin/time) 사용시 쉘 키워드로 sudo time somecommand인식되지 않으므로 일반 명령 실행 버전을 사용합니다.time

쉘(키워드) 버전을 사용하려면 아래 쉘을 실행 sudo하고 다음과 같은 키워드를 인식하도록 할 수 있습니다.

sudo bash -c 'time echo hello'

전체 셸을 실행하므로 이 형식에서 원하는 다른 복잡한 셸 구문을 사용할 수도 있습니다. 그러나 인용 등에 주의하십시오. 다음 내용은 sudo bash -c쉘 구문 분석(및 인용 및 이스케이프 해석)을 통해 실행됩니다.두 배이므로 예상치 못한 결과가 나오기 쉽습니다.

관련 정보