mkdir에 중첩 디렉토리 작성을 허용하기 위해 기본적으로 -p 플래그가 설정되지 않은 이유는 무엇입니까?


11

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

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

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

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


2
이것을 .bashrc에 넣으십시오 : alias mkdir="mkdir -p".
Kevin

결국 나는 결정했다 논의는의 별칭으로 이동합니다mkdp
Treffynnon

답변:


6

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

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

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


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

alias mkdir='mkdir -p'

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


1
비표준 방식으로 동작하도록 표준 명령의 별칭을 제안하지는 않습니다. 이로 인해 스크립트가 이식성이 떨어지고 독자가 혼동 될 수 있습니다. 새 별칭 또는 함수를 만드는 alias mkdp="mkdir -p"것이 좋습니다.
jlliagre

2
@jlliagre 아니요, 스크립트에는 영향을 미치지 않습니다. 로컬로 정의 된 별칭 .bashrc은 (일반적으로) 환경에 영향을 미치지 않습니다.
rozcietrzewiacz

실제로 당신은 내 요점을 놓쳤다. 자신의 용도로도 동작을 변경하기위한 표준 명령의 별칭을 지정하는 것은 권장되지 않습니다. 최악의 예는 유비쿼터스 alias rm='rm -i'입니다.
jlliagre

1
@jlliagre 누가 추천하지 않습니까? ;) 그러나 그렇습니다, 나는 동의합니다. 나는 다른 별명을 사용하고 싶습니다. 또한 rm -i별칭이 항상 나쁜 것으로 생각하지는 않지만 나쁜 습관으로 이어질 수 있습니다. 모든 명령 별칭이 동일 ls="ls --color=auto"하거나 나쁜 것은 아닙니다 ssh="TERM=xterm ssh". 예를 들어 고려하십시오 .
rozcietrzewiacz

내 추천에는 이데올로기가 없습니다. rm 별칭은 많은 손실 된 파일을 간접적으로 책임집니다 (이 별칭의 많은 희생자를 만났습니다). 나는 mkdir이 원치 않는 부작용을 훨씬 덜 의심합니다. 물론, 나는 당신의 ssh 및 ls 예제와 같이 행동이 아닌 장식적인 변화에 반대하지 않습니다.
jlliagre

16

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

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

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

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

예:

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

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

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


2
여기서 사용한 마운트 예제가 마음에 듭니다. 나는 그 특정 시나리오를 생각하지 못했습니다.
Treffynnon

1
-p (및 -m) 옵션은 1983 년에 System V에 의해 도입되었습니다. 둘 다 POSIX 표준의 일부입니다.
jlliagre

4

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


4

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


2

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.