bash
2008-09-24 77 views 4 likes 
4

我有一個bash腳本爲當前目錄創建一個Subversion補丁文件。如果將-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 

,因爲它通過包含在$zipcommand|>作爲參數傳遞給svn這是行不通的。

我可以很容易地解決這個問題,但問題是當它們包含在變量中時是否可以使用這些類型的操作符。

謝謝!

回答

5

我會做這樣的事情(使用bash的-c或EVAL):

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" 

這似乎工作,但我的版本的zip鍵(Mac OS X)要求我更改線路:

zipcommand='| zip - - >' 

編輯:合併@ DanielBungert的建議使用eval

+0

謝謝! 是的,我最初有錯誤的zip參數,因爲我從一個腳本中調用了這個腳本,該腳本將「svn status」給出的文件轉換爲「zip - @」,從stdin讀取文件名。 – Owen 2008-09-24 19:21:46

2

eval是你在找什麼。

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

請注意引用字符。

0

或者你應該嘗試zsh外殼whic允許定義全局別名,如:

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 
相關問題