나는 이것을 인터넷 검색하고 Stack을 검색했지만 정확히 내가하려는 일을 찾지 못했습니다. 나는 아직 이 문제를 정말로 이해할 수 없다.
따라서 gzip을 둘러싼 래퍼인 sh 스크립트가 있다고 가정해 보겠습니다(예를 들어). 명령줄에서 mysqldump
어떤 것(예:)의 출력을 내 스크립트로 파이프하고 싶습니다 . 그런 다음 스크립트는 입력을 가져와 gzip으로 파이프해야 합니다.
명령줄 예:
mysqldump somedb | mysqldump somedb | myscript > somefile.dmp.gz
myscript의 예(내가 시도한 것):
#!/usr/bin/env sh
read inp
command="echo \"$inp\" | gzip"
eval $command
이 예에는 많은 문제가 있을 수 있습니다. 도와주세요? :)
솔루션(다른 사람이 찾을 수 있음)
아래 설명 덕분에 이제 SH 스크립트 내에서 명령을 실행하면 명령을 직접 실행할 때와 마찬가지로 입력이 스크립트에 파이프된다는 것을 이해하게 되었습니다.
따라서 이 경우:
cat 파일|압축 패키지
다음과 정확히 동일한 작업을 수행합니다.
내 스크립트:
#!/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