내가 원하는 것이 file2
의 내용과 일치 하면 file1
분명히 실행할 수 있습니다 cp file1 file2
.
하지만 내가 지키고 싶다면모든 것~에 대한file2
와는 별개로콘텐츠 - 소유자, 권한, 확장 속성, ACL, 하드 링크 등을 실행하고 싶지 않습니다 . cp
* 이 경우에는 .file1
file2
다음이 트릭을 수행할 것 같습니다.
< file1 > file2
그러나 이것은 작동하지 않습니다. file2
null로 잘리고 기록되지 않습니다. 하지만,
cat < file1 > file2
하다일하다.
놀랍게도 첫 번째 버전은 작동하지 않았습니다.
두 번째 버전은 UUOC인가요? 리디렉션을 사용하여 명령을 호출하지 않고 이를 수행할 수 있는 방법이 있습니까?
참고: 저는 UUOC가 실제 안티 패턴이라기보다는 현학적인 의견에 가깝다는 것을 알고 있습니다.
* 처럼tniles09 발견,cp
~ 할 것이다이 경우에는 실제로 작동합니다.
답변1
cat < file1 > file2
UUOC가 아닙니다. 일반적으로 시스템 수준 파일 설명자 복제에 해당하는 리디렉션이 <
수행 됩니다. >
파일 설명자 복제 자체는 아무 작업도 수행하지 않습니다(음, >
리디렉션은 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 또는 에뮬레이션이 아닌 경우에는 에뮬레이트하는 쉘처럼 동작합니다).$NULLCMD
cat
<
$READNULLCMD
pager
zsh
sh
csh
그래서:
< file1 > file2
사실 똑같다
cat < file1 > file2
그리고
< file1
동일합니까?
pager < file1
답변4
< file1 > file2
쉘에 의존하는 것 같습니다. zsh에서는 작동하지만 bash에서는 작동하지 않습니다.
편집: 잘못된 진술을 제거했습니다.