답변1
가장 확실한 것은 입니다 cat
. 하지만 그것도 봐head
그리고tail
.
파일을 한 줄씩 인쇄할 수 있는 다른 쉘 유틸리티가 있습니다:sed
,awk
,grep
. 그러나 그 목적은 파일 내용을 조작하거나 파일 내에서 검색하는 것입니다.
어떤 것이 가장 효과적인지 추정하기 위해 몇 가지 테스트를 수행했습니다. 나는 골짜기를 뚫고 달렸다strace
어떤 시스템 호출이 가장 적은지 확인하세요. 내 파일에는 1275줄이 있습니다.
awk
:1355 시스템 호출cat
:51개의 시스템 호출grep
:1337 시스템 호출head
:93 시스템 호출tail
:130개의 시스템 호출sed
:1378 시스템 호출
보시다시피 cat
파일을 연결하도록 설계되었지만 가장 빠르고 효율적인 방법 중 하나입니다. sed
, 파일을 한 줄씩 인쇄 awk
하기 grep
때문에 1275개 이상의 시스템 호출이 발생합니다.
답변2
cat
이것이 가능하다는 것을 알고 있지만 주요 목적은 단순히 콘텐츠를 표시하는 것이 아니라 연결하는 것입니다.
목적 cat
은 정확히 파일을 읽고 stdout으로 출력하는 것입니다.
답변3
먼저 cat
표준 출력이 작성되는데, 이는 cat
대화형 쉘 명령의 일부로 입력되더라도 반드시 터미널일 필요는 없습니다. 표준 출력이 리디렉션되었음에도 불구하고 터미널에 무언가를 써야 하는 경우에는 쉽지 않습니다(어느 터미널을 지정해야 하며 스크립트에서 명령을 실행하는 경우 터미널이 없을 수도 있음). 명령이 단지 파이프 부분인 경우 표준 오류 출력을 (남용) 사용할 수 있습니다. 하지만 이것이 실제로 작업을 완료할 것이라고 말씀하셨기 때문에 cat
이 시나리오에 대해서는 묻지 않으실 것 같습니다.
표준 출력에 작성된 내용을 파이프로 보내려는 경우 cat
다음을 사용하면 됩니다 .쓸모없는 고양이 상, cat file | pipeline
( pipeline
모든 파이프라인을 나타냄)이 더 효율적으로 수행될 수 있기 때문입니다 <file pipeline
. 그러나 다시 말하지만, 귀하의 표현을 보면 이것이 귀하의 의도가 아니라는 것을 추론할 수 있습니다.
그래서 당신이 무엇을 걱정하고 있는지 잘 모르겠습니다. 입력이 너무 길면 cat
하나 또는 두 개의 문자 별명을 정의할 수 있습니다(표준 Unix에서는 사용되지 않는 이러한 이름이 여전히 일부 있습니다). 하지만 쓸모없는 사이클을 낭비할까봐 걱정된다면 cat
이렇게 해서는 안 됩니다.
인수 를 사용하지 않고 stdin을 stdout(파이프의 중립 객체)으로 복사하는 프로그램이 있는 경우 null
에는 를 사용할 수 있습니다 <file null
. main
line 함수는 작업을 수행하지만 cat
인수 없이 호출하면(또는 cat -
명시적으로 지정하려는 경우) 트릭을 수행할 수 있습니다.
nocat
파일 이름 인수만 취하고, 파일을 열려고 시도하고, 열 수 없으면 불평하고, 파일에서 표준 출력으로 계속 복사하는 프로그램이 있는 경우 , 이것이 바로 여러분이 요구하는 것입니다. 을 작성하는 것이 약간 더 어려울 뿐이며 null
주요 작업은 파일을 열고 테스트하고 불평하는 것입니다(주의한다면 인수가 하나만 있음을 증명하고 그렇지 않으면 불평하는 테스트를 포함할 수도 있습니다). 하지만 cat
이제 매개변수가 제공되므로 이를 수행할 수 있으므로 nocat
절차가 필요하지 않습니다.
nocat
프로그램을 성공적으로 작성한 후에 매개변수 하나에서 멈추는 이유는 무엇입니까? 코드를 루프로 감싸는 것은 for(;*argp!=NULL;++argp)
실제로 전혀 노력이 필요하지 않으며 바이너리에 최대 몇 개의 기계 명령어를 추가하고 잘못된 수의 인수에 대한 불평을 방지합니다(더 많은 명령어를 절약합니다). cat
연결 파일 인 Voilà의 원본 버전입니다 . (솔직히 말해서, 매개변수 없이 작동하도록 하려면 약간 조정해야 합니다 null
.)
물론 실제 cat
프로그램에서는 항상 그랬기 때문에 몇 가지 추가 기능을 추가했습니다. 그러나 핵심은 "연결" 측면이 cat
실제로 프로그래머 측이나 이를 수행하는 기계 측에서 전혀 노력을 필요로 하지 않는다는 것입니다. 이 사실은 그러한 프로그램이 존재하지 않음을 cat
포괄 null
하고 설명합니다. nocat
결과가 파이프로 들어가는 경우에는 cat
단일 인수를 사용하지 마십시오. 그러나 단지 파일 내용을 터미널에 표시하기 위한 것이라면 제가 링크한 페이지에서도 이것이 유용한 사용이라는 것을 인정하므로 cat
주저하지 마십시오.
여러 파일 이름을 호출하여 cat
가상 함수 주위의 간단한 루프로 실제로 그렇게 하는지 테스트할 수 있습니다. 그 중 하나는 유효하지 않은 이름이지만 첫 번째 위치에는 없습니다. 파일이 존재하지 않는다고 즉시 불평하는 대신 먼저 이전 파일을 덤프하십시오. 파일이 유효한 파일인데 유효하지 않은 파일에 대해 불평합니다(적어도 내 고양이는 그렇게 합니다).nocat
cat
cat
답변4
나는 이것이 과거 시제 질문이라는 것을 알고 있습니다. 기술적으로 파일 내용을 인쇄하는 것은 stdout
연결 형식 이므로 cat
의미상 적합합니다. 이는 printf
의미상 데이터 형식화 및 인쇄를 위한 것임을 잊지 마십시오 . Bash는 파일 입력 및 출력을 리디렉션하기 위한 구문도 제공합니다. 이들의 조합은 다음과 같은 결과를 생성할 수 있습니다.
printf '%s' "$(<file.txt)"