2017-04-25 1 views
0

引用符に関するガイドと回答があります。私はそれらを(一日中)読んだことがありますが、私はまだ私の簡単なスクリプトを動作させることができません。変数からrsyncコマンドを実行する - 引用符が付きません

私はscript1.shをセットアップしてコマンドを実行しようとしました。コマンドは変数に読み込まれなければならないので、私はそれをエコーし​​て実行し、後でそれを使って他のものを実行することができます。

私のコマンドが予想通り、私はbashのから、私は私のスクリプトに入れた場合、それを実行した場合、それは動作します

rsync -vtirn -e ssh --exclude '._*' --exclude '[email protected]*' --exclude '.DS_Store' --progress /Path/ [email protected]:/Path 

です。

間に変数を置くと、--excludesはもう働きません。

job='rsync -vtirn -e ssh --exclude '"'"'._*'"'"' --exclude '"'"'[email protected]*'"'"' --exclude '"'"'.DS_Store'"'"' --progress /Path/ [email protected]:/Path 
echo $job 
$job 

奇妙なことは、エコーが私に必要なコマンドを正確に示しているということです。エコー出力をコピーしてシェルに貼り付けると、コマンドが正常に動作しています。しかし、$ jobで始まるコマンドは、excludesを排除しています。

私は二重引用符(/ ')をエスケープして、最初と最後に二重引用符で試しています...多くの異なるオプションがありますが、--exclude' filter '引数は何も考慮されませんでした。機能したのは

job=$(rsync -vtirn -e ssh --exclude '._*' --exclude '[email protected]*' --exclude '.DS_Store' --progress /Path/ [email protected]:/Path) 

ですが、このコマンドは変数が設定されるとすぐに開始されます。

ご協力いただきありがとうございます

+1

これについては、[BashFAQ#50](http://mywiki.wooledge.org/BashFAQ/050)で詳しく説明しています。 –

答えて

3

コマンド名を格納するために通常の変数を使用しないでください。関数を定義します。

job() { 
    rsync -vtirn -e ssh --exclude '._*' --exclude '[email protected]*' --exclude '.DS_Store' --progress /Path/ [email protected]:/Path 
} 

あなたが本当にrsyncに引数を格納する配列を定義し、ロギングと実行のための単一のフォームが必要な場合。

opts=(-vtrin 
     -e ssh 
     --exclude '._*' 
     --exclude '[email protected]*' 
     --exclude .DS_Store 
     --progress 
     /Path/ 
     [email protected]:/Path 
) 
echo "rsync ${opts[*]}" 
rsync "${opts[@]}" 

ログは、実行コマンドとまったく同じではありませんが、それはする必要はありません。ログメッセージをevalに渡していません。

+0

私は 'printf '%q'" $ {opts [@]} "と考えています。実際にコマンドを実行したのと同じ効果でコピーアンドペーストできるロギングを提供するために 'echo'そのままでは、 'echo'の出力は誤解を招く可能性があります。 –

+0

あなたの(実用的な)例をありがとう、私はここからそれを取ろうとします。 rsync $ {opts [*]} "、" echo "rsync $ {opts [@]}"と 'printf '%q'の違いは何ですか?" $ {opts [ ]} ";エコー。私はそれらの3つすべてを私のスクリプトに加えました。すべてが同じものを印刷しました(最後のものはrsyncを除く) –

関連する問題