이런거 자주 보는데
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
셸에서 사용할 수 없기 때문에 실제로는 다른 결과가 생성됩니다.