
나는 이것에 대해 인터넷 검색을 하고 Stack을 검색했지만 내가 하고 싶은 정확한 일을 찾지 못했습니다. 나는 아직 이 문제에 대해 머리를 숙일 수 없습니다.
따라서 gzip의 래퍼일 뿐인 sh 스크립트가 있다고 가정해 보겠습니다(예를 들어). 명령줄에서 어떤 것(예: mysqldump
)의 출력을 내 스크립트로 파이프하고 싶습니다 . 그런 다음 해당 스크립트는 입력을 가져와서 gzip으로 파이프해야 합니다.
명령줄의 예:
mysqldump 일부 DB | myscript > somefile.dmp.gz
myscript의 예(내가 시도한 것):
#!/usr/bin/env sh
read inp
command="echo \"$inp\" | gzip"
eval $command
아마도 이 예에서는 많은 부분이 잘못되었을 것입니다. 도와주세요? :)
솔루션(다른 사용자가 찾는 경우)
아래 설명 덕분에 이제 SH 스크립트에서 명령을 실행하면 명령이 직접 실행될 때와 마찬가지로 스크립트에 파이프된 입력을 가져오게 된다는 것을 이해하게 되었습니다.
따라서 이 경우:
고양이 파일 | gzip
다음과 정확히 동일하게 수행됩니다.
myscript:
#!/usr/bin/env sh
gzip
고양이 파일 | ./myscript
그래서 제 경우에는 또 다른 문제도 있었다는 점을 지적하고 싶습니다. 실제 스크립트에서는 다음과 같이 읽어서 입력 스트림이 있는지 확인하려고 했습니다.
read inp
if [ -z "$inp" ]; then
echo "No input"
exit;
fi
read inp
이후의 입력 파이프는 비어 있는 것으로 나타났습니다 .
답변1
#!/bin/sh
gzip -c
그것으로 충분할 것입니다.
$ mysqldump ... | ./script >out.gz
gzip -c
표준 입력에서 압축되지 않은 데이터를 읽고 압축된 데이터를 표준 출력에 씁니다.
표준 입력은 파이프에 의해 제공되고 표준 출력은 파일로 리디렉션됩니다. 파이핑과 방향 재지정은 호출 쉘에 의해 처리됩니다.
sed
명령줄에서 표현식을 가져와 이에 따라 입력을 변환하거나 표현식이 사용되지 않은 경우 데이터를 전달하는 약간 더 복잡한 예 :
#!/bin/sh
if [ -n "$1" ]; then
sed -e "$1"
else
cat
fi
(여기서 를 사용하면 sed -e ""
과 동일한 효과를 얻을 수 있지만 cat
더 복잡한 예를 원했습니다)
$ utility | ./script "1,5d" >out
...에서 출력의 처음 5줄을 삭제합니다 utility
.
답변2
간단한 예를 통해 복잡한 상황을 설명하려고 하기 때문에 스크립트의 어느 부분이 단순한 오해인지, 어느 부분이 복잡한지 잘 모르겠습니다.
그렇게 말하면 이것은 귀하의 질문이 요구하는 것을 수행할 것입니다:
#!/bin/sh
gzip "$@"
답변3
을 사용하려면 입력의 일부를 읽어서 비어 있는지 여부를 확인하려면 다음과 같은 변수에 바이트 값을 저장할 수 있는 read
셸을 사용해야 합니다 .zsh
#! /bin/zsh -
if LC_ALL=C read -ru0 -k1 byte; then
# one byte was read, the input is not empty
(printf %s "$byte"; cat) | gzip
else
echo >&2 No input
fi
또는 다음과 같은 인코딩 형식을 사용하세요.
#! /bin/sh -
# get the value of the first byte as octal:
byte=$(od -An -N1 -vto1 | tr -cd 0-7)
if [ -n "$byte" ]; then
(printf "\\$byte"; cat) | gzip
else
echo >&2 No input
fi