내용을 내용과 file2
일치 시키려면 file1
분명히 실행할 수 있습니다 cp file1 file2
.
내가 보존하려는 경우, 모든 약 file2
을 제외 등의 내용 소유자, 권한, 확장 속성, ACL을, 하드 링크, 등, 그때 실행 싶지 않을 것이다 cp
. * 난 그냥를 풍덩하려는 경우 의 내용 file1
에 file2
.
다음과 같이 보입니다.
< file1 > file2
그러나 작동하지 않습니다. file2
아무것도 잘리지 않고 쓰여지지 않습니다. 하나,
cat < file1 > file2
작동 합니다.
첫 번째 버전이 작동하지 않는다는 사실에 놀랐습니다.
두 번째 버전은 UUOC입니까? 단순히 리디렉션을 사용하여 명령을 호출하지 않고이 작업을 수행 할 수 있습니까?
참고 : UUOC는 진정한 안티 패턴보다 실용적인 지점이라는 것을 알고 있습니다.
* 으로 tniles09 발견 , cp
뜻 이 경우에는 사실 일이다.
답변
cat < file1 > file2
UUOC가 아닙니다. 클래식, <
그리고 >
할 리디렉션 시스템 레벨에서 파일 기술자 중복에있는 해당합니다. 스스로 파일 기술자 중복은 (잘, 일하지 않는 >
리디렉션과 함께 열을 O_TRUNC
너무 정확, 출력 리디렉션 출력 파일을 잘라야 할). <
>
기호가 혼동 하지 않도록하십시오. 리디렉션은 데이터를 이동하지 않으며 파일 디스크립터를 다른 파일 디스크립터에 지정합니다.
이 경우 file1
해당 파일 디스크립터를 열고 파일 디스크립터 0
( <file1
== 0<file1
)에 file2
지정하고 해당 파일 디스크립터를 파일 디스크립터 1
( >file2
== 1>file2
)에 지정하십시오.
이제 두 개의 파일 디스크립터가 생겼으므로 두 파일 사이에 데이터를 셔블하는 프로세스가 필요합니다 cat
.
답변
다른 사람들이 지적했듯이 문제의 행동은 셸에 따라 다릅니다. 당신 (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
$
답변
에서 zsh
쉘, < file1 > file2
작품, 쉘이 호출 않습니다 cat
.
단지 재 지정없이 명령이나 과제, 구성 명령 행의 경우 zsh
를 원용 $NULLCMD
( cat
만 리디렉션하지 않는 한 기본적으로)을 인 <
경우에 한 $READNULLCMD
( pager
대신 호출 기본 설정). (이것은 에뮬레이션 zsh
이 sh
아니거나 csh
에뮬레이션 이 아닌 경우 에뮬레이션하는 쉘처럼 동작합니다).
그래서:
< file1 > file2
실제로는
cat < file1 > file2
과
< file1
와 같다
pager < file1
답변
< from > to
거기에 명령이 없기 때문에 작동하지 않습니다. 프로세스가 없습니다. 쉘은 파일을 열고 생성하고 경로 재 지정을 정렬합니다 (이 파일을 참조하는 파일 디스크립터가 0 및 1 : 표준 입력 및 표준 출력으로 구성됨). 그러나 표준 입력에서 읽고 표준 출력에 쓰기 위해 루프를 실행할 필요는 없습니다.
zsh
이 “널 (null) 명령”경우 사용자가 구성 할 수있는 명령을 대체하여이 작업을 수행합니다. 명령은 명령 행에 표시되지 않지만 여전히 있습니다. 프로세스가 작성되며 동일한 방식으로 작동합니다. NULLCMD
입니다 cat
그래서, 기본적으로 < from > to
실제로 의미 cat < from > to
에서 zsh
하지 않는 한, NULLCMD
다른 것으로 설정되어; “암시 적 고양이”명령입니다.
“cats의 쓸모없는 사용” cat
은 파일에서 파일을 읽고 다른 프로세스에 데이터를 공급하기 위해 중개자로 사용될 때 발생합니다. 이 프로세스의 파일 설명자는 원래 파일에 연결될 수 있습니다.
경우 cat
상황에서 제거하고, 나머지 명령은 여전히 같은 작업을 수행 할 수 있도록, 그것은 쓸모가 없다. 제거 할 수 없으면 쓸모가 없습니다.
# useless, removable:
$ cat archive.tar | tar tf - # --> tar tf archive.tar
# not removable (in POSIX shell):
$ cat > file
abc
[Ctrl-D]
# likewise:
STRING=$(cat file)
cat
입니다 대체 가능은 같은 것이 아니다. 예를 들어 파일을 만드는 대신 cat > file
사용할 수 있습니다 vi file
. cat
동일한 작업을 수행하기 위해 남은 것을 사용하는 동안 은 제거로 계산되지 않습니다 .
경우 cat
는 IS 에만 물론 제거 할 수 없습니다의 다음 파이프 라인의 명령; 남은 것을 재배치하지 않으면 동등한 작업을 수행합니다.
일부 쉘 스크립터 cat
는 입력 피연산자를 명령 행의 왼쪽 가까이로 이동할 수 있다고 생각 하기 때문에 사용합니다. 그러나 리디렉션은 명령 줄의 어느 곳에 나있을 수 있습니다.
# If you're so inclined:
# move source archive operand to the left without cat:
$ < archive.tar tar xf - > listing
답변
< file1 > file2
쉘에 의존적이며 zsh에서는 bash가 작동하지 않습니다.
편집 : 삭제 된 허위 진술
답변
모든 좋은 답변 외에도 다음을 시뮬레이션 하여 UUOC를 피할 수 있습니다 cat
.
awk 1 file1 > file2 # For line-oriented text, not binaries.
dd if=file1 of=file2 # Works for binary files, too.
# many more geeky ways.
이 명령들은 평범한 것처럼 파일 메타 데이터를 복사하지 않습니다 cp
.
답변
작동하면 해결하지 마십시오.
나는 사용할 것이다
cat < file1 > file2
의미론의 PC를 땀을 흘리지 마십시오.