-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 옵션(기본 옵션인 경우)의 동작이 본질적으로 부작용이라는 것입니다. 요청한 작업이 아닌 다른 작업을 수행하여 명령의 복잡성을 증가시킵니다. 이것은 기억해야 할 또 다른 보이지 않는 것입니다. 좋은 프로그래밍 습관의 기본 규칙 중 하나는 부작용을 피하는 것입니다.
현대 프로그래밍 언어는 매우 강력하므로 해당 언어에서 제공하는 기본 요소에서 필요할 수 있는 복잡한 명령을 작성하는 것이 상대적으로 쉽습니다. 그러기 위해서는 어떤 행동이 필요한지에 대해 의식적인 결정을 내리고 성취된 내용에 대한 구체적이고 가시적인 기록을 남겨야 합니다.