mkdir에 중첩된 디렉터리 생성을 허용하도록 기본적으로 -p 플래그가 설정되어 있지 않은 이유는 무엇입니까?

mkdir에 중첩된 디렉터리 생성을 허용하도록 기본적으로 -p 플래그가 설정되어 있지 않은 이유는 무엇입니까?

-p플래그가 기본적으로 설정되어서는 안되는 이유가 없습니다 .mkdir

  -p, --parents     no error if existing, make parent directories as needed

내가 아는 한 이것은 비파괴적인 명령입니다. 이것이 어떻게 작동하는지에 대해 중요한 것을 놓쳤습니까?

둘째, 이것을 기본 동작으로 만드는 쉬운 방법이 있습니까 mkdir?

답변1

물론, 부모 디렉터리 생성이 기본값이어야 하며, 부모 디렉터리가 존재하지 않는 경우 디렉터리 생성을 방지하기 위해 사용할 수 있는 몇 가지 확인 옵션이 있다고 주장할 수도 있습니다.

그러나 그 반대가 일어나는 이유는 역사일 뿐입니다. 기본 버전은목차상위 디렉터리가 생성되지 않습니다. 이것이 X11 배포판에 다음과 같은 소프트웨어가 함께 제공되는 이유입니다.mkediel이 작업을 수행할 수 있습니다. 상위 디렉터리가 있는지 확인하고 필요한 경우 생성합니다.

나중에 이 기능이 명령에 추가되었습니다.목차많은 UNIX 버전에서(현재 POSIX 표준에 있는지는 모르겠습니다). 호환성을 유지하기 위해 이 기능은 옵션 플래그를 켜서 제공됩니다: -p.

기본적으로 켜져 있는 것이 왜 나쁜가요? 스크립트는 다음에 따라 달라질 수 있습니다.목차상위 디렉터리가 없으면 실패합니다. 특히 사용자로서뿌리기본적으로 디렉터리 트리를 만드는 것은 위험할 수 있습니다.

예:

 if mkdir /backup/$(uname -n)/$(date +%Y%m%d)
  then
    perform_backup ...

/backup이 예에서는 /backup/$(uname -n)파일 시스템이 마운트되지 않고 상위 디렉터리가 존재하지 않는 경우에도(기본값이 그렇지 않은 경우) 디렉터리가 생성되고 백업이 수행됩니다.

경험 법칙: 도구의 기본 동작을 변경하지 않는 것이 가장 좋습니다. 원하는 경우 기본 동작을 변경할 수 있는 옵션을 제공합니다.

답변2

이는 선택적인 기능이며 항상 필요한 것은 아닙니다. 특히 스크립트에서는 더욱 그렇습니다. 스크립트의 다음 단점을 고려하십시오.

  • 디렉터리가 이미 존재한다는 사실을 보고하지 않습니다. 새로 생성된 디렉터리에 일부 파일을 넣어야 하는데 해당 디렉터리가 이미 존재하고 파일을 포함하고 있는 경우 스크립트는 많은 혼란을 일으킬 수 있습니다. (나중에 스크립트가 거기에 배치한 파일을 필터링하는 것은 번거로운 일입니다.)
  • 반면에 일부 스크립트(또는 그 일부)는 이전에 생성된 디렉터리 구조(아마도 다른 패키지/스크립트에 의해 생성됨)에 의존할 수 있습니다. 예를 들어, 패키지 설치 스크립트는 라이브러리를 하위 디렉토리에 넣어야 할 수 있지만 /usr/local/lib/GreatSoftware/ImportantPartOfIt해당 라이브러리는 아래에 있는 항목에 의존하거나 링크됩니다 /usr/local/lib/GreatSoftware. 이 콘텐츠가 누락되면 스크립트를 계속할 수 없습니다.

의 보편적인 행동은 mkdir그러한 상황이 보고되고 즉시 발견될 수 있기 때문에 그것을 간단하고 자연스럽게 만듭니다.


mkdir -p셸에서 항상 사용하려면 별칭을 만들 수 있습니다.

alias mkdir='mkdir -p'

.bashrc(이것은 구성이나 쉘이 사용하는 모든 것에 따라야 합니다 .)

답변3

나는 이것이 철학이라고 생각한다. 적나라한목차(1)명령(옵션 없음)은 다음을 나타냅니다.목차(2)시스템 호출은 셸에서 해당 기능을 제공하고 그 이상도 그 이하도 하지 않습니다.

답변4

나에게 문제는 -p 옵션(기본 옵션인 경우)의 동작이 본질적으로 부작용이라는 것입니다. 요청한 작업이 아닌 다른 작업을 수행하여 명령의 복잡성을 증가시킵니다. 이것은 기억해야 할 또 다른 보이지 않는 것입니다. 좋은 프로그래밍 습관의 기본 규칙 중 하나는 부작용을 피하는 것입니다.

현대 프로그래밍 언어는 매우 강력하므로 해당 언어에서 제공하는 기본 요소에서 필요할 수 있는 복잡한 명령을 작성하는 것이 상대적으로 쉽습니다. 그러기 위해서는 어떤 행동이 필요한지에 대해 의식적인 결정을 내리고 성취된 내용에 대한 구체적이고 가시적인 기록을 남겨야 합니다.

관련 정보