Vidar Holen의 블로그 게시물에서dd의 쓸모없는 사용dd
그는 모든 것이 파일이고 파일을 파이프로 연결할 수 있기 때문에 사실상 쓸모가 없다고 주장했습니다 .
을 사용하는 경우도 자주 볼 수 있습니다 cat
.
그러나 Vidal은 다음과 같은 예를 제시했습니다.
# Rip a cdrom to a .iso file
cat /dev/cdrom > myfile.iso
...이 작업이 가능한지 알고 싶습니다.사용하지 마세요cat
?
분명히 POSIX 셸은 첫 번째 문자 집합이 명령(그래서 "[" = "test" 등)이라고 가정하는데, 이는 내부 연산자가 있는 현대 언어에서는 흔하지 않습니다. 그리고 쉘은 실제로 인터프리터인데 왜 cat
및 둘 다 중복되는 지점에 도달하지 않았습니까 dd
?
/dev/cdrom > myfile.iso
장치에서 파일로 데이터를 복사할 수 있을 정도로 내부 연산자를 완벽하게 구현하는 POSIX 기반 셸이 있습니까 ?
또는
POSIX 사양에 이 기능을 불가능하게 만드는 뭔가가 있습니까?
이 질문은 예제의 시작 부분에 내부 연산자 대신 명령("<")을 사용한다는 점에서 UUOC 질문과 약간 다릅니다. 따라서 첫 번째 단어가 명령이라는 규칙을 여전히 고수합니다.
(그런데 저는 개인적으로 dd를 좋아합니다. 왜냐하면 그것이 없으면 웨일스어를 말하는 것이 훨씬 덜 재미있을 것이기 때문입니다. :-p)
답변1
지쉬어:
</dev/cdrom >myfile.iso
연산자는 이 작업을 수행하는 데에만 사용됩니다( sh
시뮬레이션이 아닌 경우). 그러나 실제 읽기 및 쓰기를 수행하려면 여전히 $NULLCMD
명령( cat
기본값)을 실행합니다.
제안된 구문
/dev/cdrom > myfile.iso
실제로 작동합니다지금모든 POSIX 셸에서 - 반드시 셸을 전혀 포함할 필요는 없기 때문입니다.
필요한 것은 /dev/cdrom
실행 가능하고 실행 시 CD의 내용을 출력하는 것뿐입니다. 이는 커널이나 장치 드라이버가 제공할 수 있는 것입니다. 또는 시스템 execl
(및 친구) 이 /dev/cdrom
또는 해당 내용을 부팅 키로 사용할 수 있습니다.다른해당 파일 이름을 가진 실행 파일(예 cat
: )
두 경우 모두 적절한 exec
기능이 제공되는 /dev/cdrom
모든 쉘에서 명령을 실행할 수 있습니다 . 나는 실제로 이것을 수행하는 어떤 시스템도 알지 못합니다. 아마도 좋은 이유 때문일 것입니다. 그러나 이론적으로는 허용되고 가능합니다.
POSIX
POSIX에서는 명령의 첫 번째 단어가 명령 이름으로 처리되어야 하며명령이 실행되어야 하는 방법을 정의합니다.:
쉘은 별도의 유틸리티 환경에서 이 유틸리티를 실행해야 합니다. 이는 POSIX.1-2017 시스템 인터페이스 볼륨에 정의된 execl() 함수를 명령 이름 [...]으로 설정된 path 및 arg0 매개변수와 함께 호출하는 것과 동일합니다.
execl() 함수가 [ENOEXEC] 오류와 동등한 오류로 인해 실패하는 경우, 쉘은 [...] 오류 메시지를 작성하고 종료 상태 126을 반환해야 합니다.
따라서 일관성 있는 쉘은 파일의 데이터를 열고 인쇄하는 것이 허용되지 않습니다. 그러나 쉘이 POSIX가 아닌 확장으로 이 동작을 지원할 수 없는 특별한 이유는 없습니다. 나는 당신이 제안한 형식에 상당한 단점이 있다고 생각하지만 zsh 버전은 대부분 괜찮습니다.