2017-04-24 10 views
0

を防ぐため、私は奇妙な問題を経験し、私はそれがは、スクリプトからの対端末からコマンドを実行する - ワイルドカードのパスを - グロブ展開

スクリプト

echo "tar -zcvf $file $base/$target $exclude_args" 
cd $base && tar -zcvf $file $base/$target $exclude_args 

グロブファイル/ディレクトリとは何かを持っていると思います出力

tar -zcvf www_2017-04-24.tar.gz /var/www --exclude '/var/www/bak/*/*' --exclude '/var/www/test' 

除外するパスが省略されているスクリプト(すべてのディレクトリがgzipで圧縮された)

を実行していますパテからの出力を直接実行する場合

/var/www/bak/*/*下のディレクトリは、GZIPから

更新

コマンドは、SSH経由で送信される場合があり
parse_exclude_paths(){ 
    # escape forward slashes to avoid the paths to expand 
    args=$(echo "$exclude" | sed 's,/,\\\/,g') 
    args=$(printf " --exclude '%s'" $args) 
    # strip escapes 
    echo "$args" | sed 's,\\\/,/,g' 
} 

exclude="/var/www/bak/*/* /var/www/test" 
exclude_args='' 
if [ ! -z "$exclude" ]; then 
    exclude_args="$(parse_exclude_paths "$exclude")" 
fi 

更新2

何の問題も除外されず、除外されますパスは、私はあなたの質問の履歴を詮索し、そのyou'rを見たのgzip

ssh [email protected]$host 'cd '"$base"' && tar -zcvf $file '"$base/$target $exclude_args" 
+0

どちらのシェルを使用していますか? 'bash'など? – Inian

+0

それはdebianの下にあるだけです。 – clarkk

+0

除外パターンをスクリプトとコマンドラインの両方で一重引用符で囲みますか?あなたの端末やテキストエディタが一重引用符を翻訳上の引用符(またはバッククォートなど)に翻訳している可能性はありますか? –

答えて

0

から除外されていますeに精通しています。ここで、同等の問題は、PHPには:

function foo($arg1, $arg2) { 
    echo "You passed $arg1 and $arg2\n"; 
} 

$var='"one", "two"'; 
echo "Running: foo($var);\n"; 
foo($var); 

エコープリントRunning: foo("one", "two");と、そのコマンドの作品だけで罰金、あなたがあればそれをコピー&ペースト!

なぜfoo($var);PHP Warning: Missing argument 2 for foo()と書くのですか?

答えはもちろん、変数のリテラルの引用符は関数の呼び出し方法に関係なくありません。これは、PHPとシェルの両方で同じです。

両方PHP溶液とバッシュは、アレイを使用することである。

#!/bin/bash 
file="www_2017-04-24.tar.gz" 
base="/var" 
target="www" 
exclude_args=(--exclude '/var/www/bak/*/*') 

cd "$base" && tar -zcvf "$file" "$base/$target" "${exclude_args[@]}" 

shは、より原始的であり、任意の配列をサポートしていないが、我々は、同じ効果に位置パラメータを再利用することができる:

#!/bin/sh 
file="www_2017-04-24.tar.gz" 
base="/var" 
target="www" 
set -- --exclude '/var/www/bak/*/*' # Now assigned to $1, $2, etc 

cd "$base" && tar -zcvf "$file" "$base/$target" "[email protected]" 

もう1つの選択肢は、evalを使用して、文字列をシェルコマンドとして再解釈することです。つまり、変数に影響を与える可能性のある人は誰でもシステムを引き継ぐことができますが、すべての変数が同等の権限を持つユーザーのものであれば問題ありません:

eval "tar -zcvf $file $base/$target $exclude_args" 
+0

Ok、私はシェルで経験したことはありません。しかし、複数の '--exclude'パスが存在する可能性があります。また、除外パスを持つ入力は'/var/www/bak/*/* 'のような連結文字列です。/var/test'' – clarkk

+0

私の質問が更新されました..除外パスで文字列を生成する際に問題を解決する解決策が出てきました..すべて前方スラッシュがエスケープされ、最後にストライプされました – clarkk

+0

私の質問が更新されました..もしコマンドがSSH経由で送信されても​​問題はありません – clarkk

関連する問題