한 파일을 다른 파일로 리디렉션하는 것이 UUOC입니까(쓸데없는 cat 사용)?

한 파일을 다른 파일로 리디렉션하는 것이 UUOC입니까(쓸데없는 cat 사용)?

내가 원하는 것이 file2의 내용과 일치 하면 file1분명히 실행할 수 있습니다 cp file1 file2.

하지만 내가 지키고 싶다면모든 것~에 대한file2 와는 별개로콘텐츠 - 소유자, 권한, 확장 속성, ACL, 하드 링크 등을 실행하고 싶지 않습니다 . cp* 이 경우에는 .file1file2

다음이 트릭을 수행할 것 같습니다.

< file1 > file2

그러나 이것은 작동하지 않습니다. file2null로 잘리고 기록되지 않습니다. 하지만,

cat < file1 > file2

하다일하다.

놀랍게도 첫 번째 버전은 작동하지 않았습니다.

두 번째 버전은 UUOC인가요? 리디렉션을 사용하여 명령을 호출하지 않고 이를 수행할 수 있는 방법이 있습니까?

참고: 저는 UUOC가 실제 안티 패턴이라기보다는 현학적인 의견에 가깝다는 것을 알고 있습니다.

* 처럼tniles09 발견,cp ~ 할 것이다이 경우에는 실제로 작동합니다.

답변1

cat < file1 > file2UUOC가 아닙니다. 일반적으로 시스템 수준 파일 설명자 복제에 해당하는 리디렉션이 <수행 됩니다. >파일 설명자 복제 자체는 아무 작업도 수행하지 않습니다(음, >리디렉션은 open 을 사용하므로 O_TRUNC정확하게 말하면 출력 리디렉션은 출력 파일을 자릅니다). 이 < >기호를 혼동 하지 마십시오 . 리디렉션은 데이터를 이동하지 않지만 파일 설명자를 다른 파일 설명자에 할당합니다.

이 경우 file1해당 파일 설명자를 열고 이를 파일 설명자 0( <file1== 0<file1) 에 할당한 file2다음 해당 파일 설명자를 파일 설명자 1( >file2== 1>file2)에 할당합니다.

이제 두 개의 파일 설명자가 있으므로 두 파일 설명자 간에 데이터를 이동하는 프로세스가 필요합니다. 이것이 바로 목적입니다 cat.

답변2

다른 사람들이 지적했듯이 문제의 동작은 쉘에 따라 다르기 때문에 그렇지 않습니다. 당신 (OP)이 지적했듯이 이것은 약간입니다현학적인, 심지어기분?, 어떤 종류의 테마.

그러나 GNU 시스템에는 초기 전제에 사용할 수 있는 또 다른 솔루션이 있습니다: cp --no-preserve=all file1 file2. 시도해 보세요. 설명하신 상황( file2속성을 수정하지 않고 콘텐츠를 수정하는 등)을 만족시킬 것이라고 생각합니다.

:

$ ls -l
    total 8
    -rw-r--r-- 1 tniles sambashare 16 Dec 16 12:21 fezzik
    -rw-r--r-- 1 tniles tniles     14 Dec 16 12:16 fred
$ cat *
    Lookout, world!
    Hello, world!
$ cp --no-preserve=all fred fezzik 
$ ls -l
    total 8
    -rw-r--r-- 1 tniles sambashare 14 Dec 16 12:22 fezzik
    -rw-r--r-- 1 tniles tniles     14 Dec 16 12:16 fred
$ cat *
    Hello, world!
    Hello, world!

고쳐 쓰다 실제로, 또는 cp지정하지 않는 한 내 시스템 자체가 속성을 유지하는 것 같습니다 -a. -p저는 bash 쉘과 GNU coreutils를 사용하고 있습니다.매일 새로운 것을 배우는 것 같아요...


와일드카드를 통한 테스트 결과에는 하드 링크와 다양한 권한이 포함됩니다.

$ ls -li
total 12
913966 -rw-rw-r-- 1 vagrant vagrant 30 Dec 16 20:26 file1
913965 -rwxrw---- 2 pete    vagrant 39 Dec 16 20:35 file2
913965 -rwxrw---- 2 pete    vagrant 39 Dec 16 20:35 hardlinktofile2
$ cat file1
This is the contents of file1
$ cat file2
This is the original contents of file2
$ cp file1 file2
$ ls -li
total 12
913966 -rw-rw-r-- 1 vagrant vagrant 30 Dec 16 20:26 file1
913965 -rwxrw---- 2 pete    vagrant 30 Dec 16 20:37 file2
913965 -rwxrw---- 2 pete    vagrant 30 Dec 16 20:37 hardlinktofile2
$ cat file1
This is the contents of file1
$ cat file2
This is the contents of file1
$ 

답변3

zsh작업 쉘에서 < file1 > file2쉘은 을 호출합니다 cat.

리디렉션만 포함하고 명령이나 할당은 포함하지 않은 명령줄에 대해 (기본적으로) 호출됩니다. 단, 유일한 zsh리디렉션 이 하나 인 경우에는 ( 기본적으로) 호출됩니다. ( in 또는 에뮬레이션이 아닌 경우에는 에뮬레이트하는 쉘처럼 동작합니다).$NULLCMDcat<$READNULLCMDpagerzshshcsh

그래서:

< file1 > file2

사실 똑같다

cat < file1 > file2

그리고

< file1

동일합니까?

pager < file1

답변4

< file1 > file2쉘에 의존하는 것 같습니다. zsh에서는 작동하지만 bash에서는 작동하지 않습니다.

편집: 잘못된 진술을 제거했습니다.

관련 정보