zcat
단일 출력 스트림을 bash 파이프라인에 전달하려고 합니다 . wc -l
이 예제에서는 이를 파이프라인 으로 사용해 보겠습니다 .
zcat -f /var/log/log.3.gz /var/log/log.2.gz /var/log/log.1.gz /var/log/log | wc -l
실제로 반환되는 것은 행 수입니다.
paths="/var/log/log.3.gz /var/log/log.2.gz /var/log/log.1.gz /var/log/log"
zcat -f "${paths}" | wc -l
gzip: /var/log/log.3.gz /var/log/log.2.gz /var/log/log.1.gz /var/log/log.gz: 해당 파일이나 디렉터리가 없습니다.
내 파이프라인이 중간 파일 없이 한 번의 패스만 만들 수 있도록 이러한 모든 파일을 stdout에 병합하려면 어떻게 해야 합니까? .gz
변수에 추가된 전체 문자열 결과를 단일 매개변수인 것처럼 전달해 보았습니다.
답변1
var=('first value' 'second value'...)
목록은 의 구문을 사용하여 할당됩니다 bash
.
paths=(/var/log/log.3.gz /var/log/log.2.gz /var/log/log.1.gz /var/log/log)
zcat -f -- "${paths[@]}" | wc -l
of에는 파일 이름 인수가 전달되지 않으면 출력이 전혀 생성되지 않고 표준 입력이 읽히는 $path
빈 목록이 포함되어 있습니다 zcat -f -- "${paths[@]}"
.zcat -f --
zcat
이 문제를 해결하려면 다음을 수행할 수 있습니다.
{ (( ${#paths[@]} == 0 )) || zcat -f -- "${paths[@]}"; } | wc -l
또는:
zcat -f -- </dev/null "${paths[@]}" | wc -l
/var/log/log*
파일을 역순으로 연결 하려면 다음 zsh
보다 셸을 사용하는 것이 좋습니다 bash
.
zcat -f /var/log/log*(nOn) | wc -l
(이것은 ame의 n
숫자 o
rder( O
역대문자 사용) 입니다 n
.)
일치하는 파일이 없으면 위의 해결 방법은 필요하지 않습니다.
$ zcat -f /var/log/log*(nOn) | wc -l
zsh: no matches found: /var/log/log*(nOn)
0
답변2
따옴표가 없는 변수는 셸이 토큰화 및 파일 이름 생성을 수행하도록 합니다. 첫 번째 효과만 원하므로 후자를 비활성화할 수 있습니다.
paths="/var/log/log.3.gz /var/log/log.2.gz /var/log/log.1.gz /var/log/log"
(
set -f
zcat -f $paths | wc -l # variable is unquoted
)
설정이 해당 하위 쉘의 수명 동안에만 유효하도록 괄호를 추가했습니다.
분명히 쉘이 토큰화되도록 허용한다는 것은 경로 이름에 공백이 포함되어 있으면 쉘이 손상된다는 것을 의미합니다.