사람이 정의한 대로 이 명령은 파일에서 입력을 받습니다.
$ command -r FILENAME
를 사용하여 생성되었으므로 이것이 FILENAME
파일 이름 목록을 포함하는 파일이라고 가정합니다 ls > FILENAME
.
대신 결과를 명령에 직접 제공하려면 어떻게 해야 합니까 ls
? 제가 보기에는 다음과 같은 일이 가능할 것 같습니다.
$ ls | command -r
하지만 그렇지 않습니다. 의 출력은 ls
매개변수로 연결되지 않습니다. 산출:
Usage: command -r FILENAME
error: -r option requires an argument
원하는 효과를 어떻게 얻을 수 있습니까?
답변1
명령에 따라 다릅니다. 파일에서 읽는 일부 명령은 파일이 크기가 미리 알려져 있고 어느 위치에서나 읽고 되감을 수 있는 일반 파일이라고 예상합니다. 파일 내용이 파일 이름 목록인 경우에는 이런 일이 발생할 가능성이 없습니다. 그러면 명령에 다음이 포함될 수 있습니다.관로처음부터 끝까지 순차적으로 읽혀집니다. 파일 이름이 필요한 명령에 데이터를 파이프하는 방법에는 여러 가지가 있습니다.
많은 명령은
-
이를 읽는 것을 의미하는 특별한 이름으로 취급합니다.표준 입력파일을 여는 대신. 이는 의무가 아닌 계약입니다.ls | command -r -
/dev
많은 UNIX 변형은 표준 설명자를 지정하는 특수 파일을 제공합니다. 존재하는 경우/dev/stdin
, 표준 입력에서 읽는 것과 동일하게 열리고 읽혀집니다/dev/fd/0
.ls | command -r /dev/stdin ls | command -r /dev/fd/0
쉘이 ksh, bash 또는 zsh인 경우 쉘이 특정 파일 설명자를 할당하는 작업을 처리하도록 할 수 있습니다. 이 방법의 가장 큰 장점은 표준 입력에 의존하지 않기 때문에 다른 목적으로 표준 입력을 사용할 수 있고 여러 번 사용할 수 있다는 점입니다.
command -r <(ls)
명령에서 이름이 특정 형식(일반적으로 특정 확장명)일 것으로 예상하는 경우 기호 링크를 사용하여 속일 수 있습니다.
ln -s /dev/fd/0 list.foo ls | command -r list.foo
또는 명명된 파이프를 사용할 수도 있습니다.
mkfifo list.foo ls >list.foo & command -r list.foo
알아채다파일 목록을 생성하는 중에 ls
문제가 발생했습니다.ls
인쇄할 수 없는 문자가 포함된 경우 파일 이름이 손상되는 경향이 있기 때문입니다 . printf '%s\n' *
더욱 안정적입니다. 파일 이름의 모든 바이트를 그대로 인쇄합니다. 개행 문자가 포함된 파일 이름은 여전히 문제를 일으킬 수 있지만, 명령에 개행 문자로 구분된 파일 이름 목록이 필요한 경우 이는 불가피합니다.
답변2
그것은해야한다:
ls | xargs -n 1 command -r
편집: 공백이 있는 이름의 경우:
ls | xargs -d '\n' -n 1 command -r
답변3
많은 명령이 -
"표준 입력 사용"을 의미하는 "파일 이름"을 허용하지만 이 규칙은 보편적이지 않습니다. 매뉴얼 페이지를 읽어보세요.
답변4
이는 귀하의 목적에 적합해야 합니다.ls | command -r /dev/stdin