새 파일을 만들 때 "터치 파일"과 "> 파일"의 차이점은 무엇입니까?


13

저는 Linux를 처음 사용합니다. bash를 사용하여 현재 디렉토리 아래에 새 파일 .gitignore를 만들면 다음을 수행 할 수 있음을 알았습니다.

> .gitignore

또는

touch .gitignore

그들은 같은 일을하는 것 같습니다. 에 대한 설명서를 확인하면 touch현재 파일의 타임 스탬프 변경이 표시되지만에 대한 설명서는 없습니다 >. 따라서 누군가가 할 수있는 >일을 설명 할 수 있으며이 맥락 에서이 두 명령을 사용하는 데 차이점이 있습니까? 감사.


1
의도 된 사용법을 배우지 않고 파일 생성기로 '>'를 사용하는 방법에 대해 궁금합니다
forresthopkinsa

1
Bash 매뉴얼에 문서화 된 리디렉션이 있습니다. 명령 행에서 명령을 입력하십시오 man bash. 긴 문서이며 잘 이해하는 데 며칠 또는 몇 주가 걸리지 만 Bash를 철저히 배우고 싶다면 가치가 있습니다.
Paddy Landau

답변:


21

>쉘 재 지정 연산자입니다. 쉘 명령에서 ">"와 ">>"의 차이점은 무엇입니까?를 참조하십시오 . 언제 <또는 <() 또는와 <<> 또는> ()를 사용합니까? 주로 명령의 출력을 파일로 리디렉션하는 데 사용됩니다. 파일이 존재하지 않으면 셸에서 파일을 만듭니다. 존재하는 경우, 쉘은 잘립니다 (비 웁니다). 을 사용하면 > file명령이 없으므로 셸에서 파일을 만들지 만 출력이 전송되지 않으므로 빈 파일을 만들거나 기존 파일을 비 웁니다.

touch이미 알고 있듯이 파일을 작성하거나 타임 스탬프를 업데이트하는 외부 명령입니다. 을 사용 touch하면와 달리 파일 내용이 손실되지 않습니다 >.

동작은 >셸 에 따라 다릅니다. bash, dash 및 대부분의 쉘에서 > foo예상대로 작동합니다. zsh에서는 기본적으로 다음 > foo과 같이 작동합니다. cat > foozsh는 입력을 기다립니다.


10
여기서 중요한 점은 사이에 실질적인 차이가 없다는 것입니다 >> filetouch file하지만 만약 file존재하지 않는, 둘 사이의 큰 차이가있다 > file(이전 내용이 점에서 file손실이). 즉, zsh의 일관성없는 동작은 touch file"가장 안전한"방법이므로 올바른 방법으로 기억해야합니다.
Monty Harder

1

흥미로운 비교는 다음과 같습니다.

$ cat redirect.sh touch.sh sed.sh awk.sh cp.sh truncate.sh tee.sh vi.sh
> redirect.txt
touch touch.txt
sed 'w sed.txt' /dev/null
awk 'BEGIN {printf > "awk.txt"}'
cp /dev/null cp.txt
truncate -s0 truncate.txt
tee tee.txt </dev/null
vi -esc 'wq vi.txt'

결과:

$ strace dash redirect.sh | wc -l
387

$ strace dash touch.sh | wc -l
667

$ strace dash sed.sh | wc -l
698

$ strace dash awk.sh | wc -l
714

$ strace dash cp.sh | wc -l
786

$ strace dash truncate.sh | wc -l
1004

$ strace dash tee.sh | wc -l
1103

$ strace dash vi.sh | wc -l
1472

1
비교가 흥미로울 지 모르지만, 나는 당신이 여기서보고 싶은 것을 실제로 보지 못합니다. 당신이하려는 것을 설명 할 수 있습니까? 파일에 물건을 쓰는 방법이 다르지만 약간 혼란 스럽습니다. 그래도 커피가 부족할 수 있습니다.
m00am

@ m00am 여기에 표시된 것은 효과적으로 파일을 만드는 8 가지 방법입니다. strace실행중인 시스템 호출을 보여 주어야하며 > file.txt메소드는 실행되는 시스템 호출의 최소량으로 표시됩니다. 도구가 복잡할수록 시스템 호출이 더 복잡합니다. 표시된 예제와 함께 문제는, 그러나 즉 strace에 기록 stderr기본적으로 스트리밍하고,이 대답에 스티븐은 읽기 전용 파이프를 사용하는 stderr나는 약간 그가 사용하여 라인을 계산하는 방법을 혼동하고있어, 그래서 |파이프가 아닌|&
세르지 Kolodyazhnyy

그리고 |&@Serg가 언급했듯이 우분투 16.04 에서을 사용하여 여기에있는 것의 5 분의 1을 얻습니다 ... vi나는 거의 같은 값을 얻는 경우를 제외하고
muru

WSL? 와우 .. WSL이 그렇게 많은 시스템 호출을 추가 것이라고 생각하지 않았습니다 .
muru

@muru Cygwin-WSL이 아직 준비되지 않았습니다. stackoverflow.com/a/40370009
Steven Penny
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.