mkdir에 중첩 디렉토리 작성을 허용하기 위해 기본적으로 -p 플래그가 설정되지 않은 이유는 무엇입니까? directories as needed 내가 볼 수있는 것에서 비파괴적인

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

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

내가 볼 수있는 것에서 비파괴적인 명령입니다. 이것이 작동하는 방식에 중요한 것을 놓친 적이 있습니까?

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



답변

이것은 특히 스크립트에서 바람직하지 않은 선택적 기능입니다. 스크립트의 경우 다음과 같은 단점을 고려하십시오.

  • 디렉토리가 이미 존재한다는 사실은보고되지 않습니다. 스크립트가 일부 파일을 새로 작성된 디렉토리에 넣고 해당 디렉토리가 이미 존재하고 파일을 포함하는 경우 스크립트가 많은 혼란을 야기 할 수 있습니다. (나중에 스크립트에 의해 배치 된 파일을 필터링하는 것은 수고 스럽습니다.)
  • 위와 반대로 일부 스크립트 (또는 그 일부)는 이전에 생성 된 디렉토리 구조 (다른 패키지 / 스크립트에 의해 가능)에 의존 할 수 있습니다. 예를 들어, 패키지 설치 스크립트는 라이브러리를 /usr/local/lib/GreatSoftware/ImportantPartOfIt하위 디렉토리에 넣어야 하지만 라이브러리는 아래에있는 것들에 의존합니다 /usr/local/lib/GreatSoftware. 이것이 없으면 스크립트는 계속 진행되어서는 안됩니다.

mkdir이러한 상황이보고되고 바로 잡힐 수 있으므로 일반적인 동작은 쉽고 자연스러워집니다.


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

alias mkdir='mkdir -p'

(이것은 .bashrc쉘이 사용하는 구성으로 이동해야 합니다.)


답변

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

그러나 그것이 반대의 이유는 단지 역사입니다. mkdir 의 기본 버전은 상위 디렉토리를 작성하지 않았습니다. 그렇기 때문에 X11 배포판 에이 작업을 수행 할 수있는 mkdirhier 라는 명령이 제공되었습니다 . 상위 디렉토리가 있는지 확인하고 필요한 경우 작성하십시오.

나중에이 기능은 많은 UNIX 버전에서 mkdir 명령에 추가되었습니다 (현재 POSIX 표준인지 여부는 모르겠습니다). 호환성을 유지하기 위해 옵션 플래그를 설정하여이 기능을 사용할 수 있습니다 -p.

기본적으로 켜져있는 것이 나쁜 이유는 무엇입니까? 부모 디렉토리가 존재하지 않으면 스크립트는 mkdir 실패 에 의존 할 수 있습니다. 특히 사용자 루트 로서 기본적으로 디렉토리 트리를 작성하는 것은 위험 할 수 있습니다.

예:

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

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

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


답변

제 생각에는 이것이 일종의 철학입니다. 베어 mkdir (1) 명령 (옵션 없음)은 mkdir (2) 시스템 호출을 나타내며 쉘에서 기능을 제공하며 더 이상 또는 그 이하의 작업을 수행하지 않습니다.


답변

에서 시작 만 베어 있었다 mkdir명령. Unix의 디자인 원칙에 따라이 간단한 명령은 하나의 간단한 작업 인 디렉토리 만들기를 수행했습니다.

나중에 호출자가 특정 경로가 존재하는지 확인하기 위해 하나 이상의 디렉토리를 0 개 만들려는 일반적인 사용 사례를 처리 mkdir하는 -p옵션을 얻었습니다 . 여러 가지 이유로 기본 작업이되지 않았습니다. 첫째, 모든 시스템에 이보다 복잡한 기능이있는 것은 아니며 -p옵션이 필요하다는 것은이 스크립트를 사용하는 스크립트가 mkdir: invalid option -z때때로 디렉토리를 이상하게 작성하는 데 실패하지 않고 합리적인 오류 메시지 (와 같은 것)를 얻는 것을 의미했습니다 . 둘째로, 가장 중요한 것은 행동이 모든 경우에 mkdir -p호환되는 대체품이 아니라는 것 mkdir입니다.

특히, 가장 fileystems에 mkdir원자 조작 . 프로그램이 실행 mkdir playground되고 명령이 성공하면 프로그램은 playground디렉토리를 만들었다는 것을 알게 됩니다. 이를 통해 프로그램은 새 디렉토리를 전용 놀이터로 취급 할 수 있습니다. 동일한 프로그램의 다른 인스턴스가 동시에 실행중인 경우 호출 mkdir playground이 실패합니다. 이 속성은 mkdir -p인수가 존재할 수 있기 때문에 제공되지 않습니다.

mkdir -p시작부터 존재 했다면 mkdir -a단일 디렉토리 작성 명령 과 같은 기본 모드로 설정되었을 수 있습니다 . 그러나 이것은 일반적인 유닉스 디자인 철학을 따르지 않았을 것입니다. 대부분의 기본 유틸리티는 기본 옵션을 둘러싼 단순한 래퍼이며 멋진 옵션 (한 번에 여러 디렉토리를 만드는 것과 같은)의 행동이 있습니다.


답변

나에게 문제는 -p 옵션이 기본값 인 경우 동작이 본질적으로 부작용이라는 것입니다. 요청한 작업에 추가 작업을 수행하여 명령을 복잡하게 만듭니다. 기억해야 할 또 하나의 보이지 않는 것입니다. 사운드 프로그래밍 실습의 기본 규칙 중 하나는 부작용을 피하는 것입니다.

최신 프로그래밍 언어는 너무 강력하여 언어가 제공하는 기본 요소에서 필요한 복잡한 명령을 비교적 쉽게 작성할 수 있습니다. 이를 위해서는 어떤 행동이 필요한지에 대한 의식적인 결정을 내리고 수행 된 일에 대한 구체적이고 가시적 인 기록을 남깁니다.


답변