2008-09-24 5 views
4

현재 디렉토리에 대한 Subversion 패치 파일을 만드는 bash 스크립트가 있습니다. -z이 스크립트의 인수로 주어지면 생성 된 파일을 압축하도록 수정하려고합니다.변수에 리디렉션과 파이프를 지정할 수 있습니까?

다음은 관련 부분 :

zipped='' 
zipcommand='>' 

if [ "$1" = "-z" ] 
then 
    zipped='zipped ' 
    filename="${filename}.zip" 
    zipcommand='| zip >' 
fi 

echo "Creating ${zipped}patch file $filename..." 

svn diff $zipcommand $filename 

| 또는 >svn에 인수로 $zipcommand에 포함 전달하기 때문에이 작동하지 않습니다.

나는이 문제를 쉽게 해결할 수 있지만 문제는 변수에 포함되어있을 때 이러한 종류의 연산자를 사용할 수 있는지 여부입니다.

감사합니다.

답변

5

나는 이런 식으로 뭔가 (사용 bash는 -c 또는 평가)을 할 것입니다 :

zipped='' 
zipcommand='>' 

if [ "$1" = "-z" ] 
then 
    zipped='zipped ' 
    filename="${filename}.zip" 
    zipcommand='| zip [email protected]' 
fi 

echo "Creating ${zipped}patch file $filename..." 

eval "svn diff $zipcommand $filename" 
# this also works: 
# bash -c "svn diff $zipcommand $filename" 

이 작동하는 것처럼 보이지만 우편의 내 버전 (맥 OS X)를 전 라인을 변경하는 것이 필요합니다 :

zipcommand='| zip - - >' 

에 편집 : DanielBungert의 제안 @ 통합은 평가

를 사용하는
+0

감사! 그리고 stdin에서 파일 이름을 읽는 "zip - @"로 "svn status"가 제공 한 파일을 파이프하는 스크립트에서 이것을 채택하여 원래 잘못된 Zip 인수를 가졌습니다. – Owen

2

eval가 당신이 찾고있는 것입니다.

# eval 'printf "foo\nbar" | grep bar' 
bar 

따옴표로주의하십시오.

0

또는 당신은 예를 들어 글로벌 별칭을 정의 할 수 있습니다 whic zsh 쉘, 시도해야합니다 :

alias -g L='| less' 
alias -g S='| sort' 
alias -g U='| uniq -c' 

그런 다음

(뒤에서보고했다 사람 ;-) 다소 비밀이다)이 명령을 사용하십시오
./somecommand.sh S U L 

HTH

0

열기 프로세스 압축을 처리 할 수있는 대체 또는 명명 된 파일에 하나의 새로운 파일 핸들입니다. 그런 다음 svn diff의 출력을 해당 파일 핸들로 재 지정하십시오.

if [ "$1" = "-z" ]; then 
    zipped='zipped ' 
    filename=$filename.zip 
    exec 3> >(zip > "$filename") 
else 
    exec 3> "$filename" 
fi 

echo "Creating ${zipped}patch file $filename" 
svn diff >&3 
관련 문제