한 파일을 다른 파일로 리디렉션하는 것이 UUOC (cat의 쓸모없는 사용)입니까? 같이 보입니다. < file1 > file2 그러나

내용을 내용과 file2일치 시키려면 file1분명히 실행할 수 있습니다 cp file1 file2.

내가 보존하려는 경우, 모든file2 을 제외 등의 내용 소유자, 권한, 확장 속성, ACL을, 하드 링크, 등, 그때 실행 싶지 않을 것이다 cp. * 난 그냥를 풍덩하려는 경우 의 내용 file1file2.

다음과 같이 보입니다.

< file1 > file2

그러나 작동하지 않습니다. file2아무것도 잘리지 않고 쓰여지지 않습니다. 하나,

cat < file1 > file2

작동 합니다.

첫 번째 버전이 작동하지 않는다는 사실에 놀랐습니다.

두 번째 버전은 UUOC입니까? 단순히 리디렉션을 사용하여 명령을 호출하지 않고이 작업을 수행 할 수 있습니까?

참고 : UUOC는 진정한 안티 패턴보다 실용적인 지점이라는 것을 알고 있습니다.

* 으로 tniles09 발견 , cp 이 경우에는 사실 일이다.



답변

cat < file1 > file2UUOC가 아닙니다. 클래식, <그리고 >할 리디렉션 시스템 레벨에서 파일 기술자 중복에있는 해당합니다. 스스로 파일 기술자 중복은 (잘, 일하지 않는 >리디렉션과 함께 열을 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대신 호출 기본 설정). (이것은 에뮬레이션 zshsh아니거나 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를 땀을 흘리지 마십시오.