bash -c "COMMAND"
(적어도 일반적인 Linux 버전에서는) 실행할 때 아무런 명령도 없이 명령이 있는 것으로 알려져 있습니다.메타문자(와는 별개로공간,상표또는새로운 팀), bash -c
프로세스는 분기되지 않고 자체 최적화 대신 시스템 호출 실행을 COMMAND
직접 사용하므로 결과는 하나의 프로세스만 됩니다.execve
$ pid=$$; bash -c "pstree -p $pid"
bash(5285)───pstree(14314)
메타 문자(예: 리디렉션)가 있거나 여러 명령(어차피 하나의 메타 문자가 필요함)이 있는 경우 bash
실행되는 모든 명령이 분기됩니다.
$ pid=$$; bash -c ":; pstree -p $pid"
bash(5285)───bash(28769)───pstree(28770)
$ pid=$$; bash -c "pstree -p $pid 2>/dev/null"
bash(5285)───bash(14403)───pstree(14404)
이것은 문서화되지 않은 최적화 기능입니까(즉, 보장되지 않음) 아니면 어딘가에 문서화되어 보장됩니까?
노트:모든 버전이 이런 식으로 동작하는 것은 아니며 일부 버전에서는 보장이 아닌 구현 세부 사항으로 간주되지만 적어도 일부 버전이 이를 명시적으로 지원하고 이에 대한 조건을 문서화했는지 bash
알고 싶습니다 . bash
예를 들어, ;
명령 뒤에 두 번째 명령이 없는 문자가 오는 경우에도 bash
여전히 execve
분기되지 않습니다.
$ pid=$$; bash -c "pstree -p $pid ; "
bash(17516)───pstree(17658)
내 질문의 배경
앞서 언급했듯이 이러한 동작은 숙련된 사용자 1 2bash
에게 잘 알려져 있으며 오랫동안 익숙했습니다.
어느 날 다음 댓글을 보았습니다.대화형 bash 셸: 명령줄 옵션을 통해 작업 디렉터리 설정@dave_thompson_085가 쓴 곳:
bash
마지막(또는 유일한) 명령을 자동으로 실행(즉, 자신을 대체)합니다-c
.
나는 명령이 하나뿐인 경우에만 해당된다고 대답했습니다. 하지만 궁금했습니다. bash
마지막 명령이 어디에 있을 수 있는지 에 대한 버전이 있나요?예 exec
이전에 다른 명령이 있었더라도 ed이고 분기되지 않았습니까? 일반적으로 이 동작이 보장됩니까? 일부 bash
버전에서는 소스 코드 외부에 이 기능을 노출(및 세부정보)합니까?
기타 참고자료
답변1
사용법 exec
은 구현 세부 사항입니다. 문서화되지 않은 경우 모든 릴리스에서 동작이 보장되지 않습니다. 널리 사용되는 다른 소프트웨어(Linux 커널)를 개발한 내 경험을 바탕으로 우리가 이러한 사항을 문서화하지 않는 경향이 있는 이유를 조금 검토하는 것이 도움이 될 수 있습니다.
일반적으로 널리 사용되는 소프트웨어의 경우 일반적으로 해당 소프트웨어의 기능, 작동 및 표준 동작만 설명하려고 합니다. 사람들은 해당 동작에 대한 다운스트림 종속성을 생성할 것을 두려워하여 내부 최적화의 세부 사항을 조사하는 것을 피하는 경우가 많습니다.
내가 커널 메모리 관리 작업을 하는 내 작업 분야의 예를 들어, 우리는 재활용 우선 순위 내부가 어떻게 작동하는지 또는 LRU 스캔과 같은 작업이 수행되는 시기를 자세히 문서화하려고 하지 않습니다. 이를 문서화하면 최적화 및 기타 변경 사항에 대한 향후 결정이 복잡해집니다. 이제 보이지 않고 알려지지 않은 다운스트림 종속성이 손상되었는지 여부를 고려해야 하기 때문입니다.
마찬가지로 bash 또는 기타 복잡한 소프트웨어 시스템의 경우 내부 메커니즘(예: exec
새 프로세스를 포크하는 대신 사용하기로 결정)이 짧은 기간 동안에도 변경될 수 있습니다. 갑자기 exec를 사용하지 않아도 되는 새로운 성능 최적화, 보안 고려 사항 또는 호환성 문제가 있다고 상상해 보십시오. 우리는 이런 식으로 계속 운영하기 위해 정말로 계약에 묶여 있기를 원하는 걸까요? 당연히 아니지.
Bash 및 기타 널리 사용되는 대부분의 프로젝트에서는 노출에 필요한 것으로 간주되는 것만 포함하는 안정적이고 잘 정의된 외부 인터페이스를 유지하여 필요에 따라 내부 구현을 발전시키는 데 중점을 둡니다. 이러한 접근 방식은 혁신과 개선 능력을 희생하지 않고도 소프트웨어가 강력하고 안전하며 효율적인 상태를 유지하도록 보장합니다.
따라서 귀하의 질문에 대답하자면, 아니요. 이는 문서화되어 있지 않으므로 이에 의존해서는 안 됩니다. 내부 제약 조건을 추가하면 개발이 더욱 제한되기 때문에 이러한 상황이나 기타 유사한 상황이 문서화될 가능성도 거의 없습니다.