어떤 상황에서 프로그램을 직접 실행하는 대신 "sh -c"를 사용해야 합니까?

어떤 상황에서 프로그램을 직접 실행하는 대신 "sh -c"를 사용해야 합니까?

이런거 자주 보는데

sh -c "curl -o …"

그냥 사용하는 것보다 어떤 상황에 사용해야 할까요?

curl -o …

답변1

일반적으로 피할 수 있다면 그렇게 하지 않을 것입니다. 두 가지 예는 기본적으로 동일합니다.

그러나 이는 프로세스 내에서 셸 연산자를 사용하려는 비교적 일반적인 패턴입니다. 예를 들어 리디렉션 연산자 >나 파이프를 사용합니다 |.

둘 사이에는 미묘한 차이가 있습니다.

curl -o example.com/foo > foo
sh -c "curl -o example.com/foo > foo"

첫 번째에서는 현재 명령줄 셸이 파일을 생성 foo하고 파일에 열린 파일 핸들을 연결합니다 . 두 번째에서는 파일을 생성하고 컬에 연결하는 작업을 curl담당하는 새 셸 프로세스를 생성합니다 .foo

왜 이것이 필요할 수 있습니까?

권한

이는 현재 셸에서 다른 제약 조건이 있는 명령을 실행할 때 중요해집니다. 예를 들어, sudo현재 쉘이 아닌 다른 사용자로 명령을 실행하십시오. 그래서 이 둘은진짜다른:

sudo curl -o example.com/foo > foo
sudo sh -c "curl -o example.com/foo > foo"

첫 번째 경우 파일은 foo현재 셸에서 열리므로 사용자가 열거나 생성합니다.

둘째, 사용자는 root무제한 액세스로 파일을 열거나 생성합니다.

지연된 쉘 확장

또 다른 이유는 변수 확장이 지연되었기 때문일 수 있습니다. 유용한 예가 없습니다. 그러나 드문 경우지만 확장 변수의 시간/위치를 지연시키는 것이 유용할 수 있습니다.

hello=wave
echo $hello
hello=wave
sh -c 'echo $hello'

변수가 hello내보내지지 않아 sh셸에서 사용할 수 없기 때문에 실제로는 다른 결과가 생성됩니다.

관련 정보