15

私の Web サイトのコードは、このコードを使用してサーバー (Ubuntu) に自動展開します。

cmd = 'cd ' + checkout_dir + ' && ' + svn_command + " st | awk '{print $2}' | grep -v ^deploy | tac | xargs -r" + svn_command + " revert -R && " + svn_command + ' up -r ' + options.revision

このコマンドはcd、チェックアウト ディレクトリに入れ、 を実行し、ファイル名 ( )svn statusを抽出し、ディレクトリとそのすべてのファイルをリストから削除します (元に戻したくありません)。引数がない場合、svn revert コマンドは実行されません。$2deploy

残念ながら、xargs -r私のマシン (Mac OS X 10.8) では動作しません。だから私はここで立ち往生しています、誰か助けてもらえますか?

4

4 に答える 4

5

実際、 の BSD 実装にはフラグ ( )xargsがありません。Linux の GNU バージョンにはそれがあります。-r--no-run-if-empty

Linux と BSD の両方で機能する方法でこの問題を回避する 1 つの方法を次に示します。

... | (grep -v ^deploy || echo :) | xargs svn revert

の出力が空の場合、grep ... || echo :真ん中にある行が生成されます。まだコマンドを実行するため、少し汚れています。リポジトリにファイルが含まれていない場合、これは何の効果もないはずなので、許容できます。リポジトリにそのようなファイルがない限り、他のものでもかまいません。:grepxargssvn revert :::

最後に、@tripleeeが指摘したように、grep ... || echo :を で囲む必要があります(...)

||よりも優先順位が高い|ため、(最初の) パイプラインを終了します。

コードは Python 文字列のように見えます。次のようにすると読みやすくなります。

kwargs = {
  'svn': svn_command,
  'dir': checkout_dir,
  'revno': options.revision,
}
cmd = "cd {dir} && {svn} st | awk -v r=1 '$2 ! ~ /deploy/ {{ print $2; r=0 }} END {{ r || print \":\" }}' | xargs {svn} revert && {svn} up -r {revno}".format(**kwargs)

私はあなたのオリジナルにいくつかの変更を加えました:

  • @tripleeeが提案したように、 grepinsideのロジックを移動しました。ハックはもう必要ないので、ラップする必要もないことに注意してくださいawkgrep(...)
  • tac要点がわからないため、 を削除しました
  • -Rfromを削除しましたsvn revert。必要ないと思うためです
于 2013-07-01T19:02:22.590 に答える
3

-rforxargsは GNU 拡張であるため、OS X では機能しません。回避策としては、解析可能なダミー ファイルを指定するかxargs、引数がない場合にコマンドを呼び出さないようにする必要があります (事前に確認できます)。

一時ファイル (またはその他のプレースホルダー) を使用する方法:

some_cmd ... | xargs svn revert $(mktemp)

シェルでの条件の使用:

files=$(cd checkout_dir && ... | tac)
if [ -n "$files" ]; then
    echo $files | xargs && ...
fi

参照: xargs の空の結果を無視する

于 2016-05-13T21:37:51.270 に答える
3

きれいではありませんが、うまくいけば回避策です。

cmd = 'cd ' + checkout_dir + ' && ' + 
    'r=$(' svn_command + ' st | ' +
        "awk '$2 !~ /^deploy/{print $2}' | tac) && " +
    'test "$r" && ' +
    svn_command + ' revert -R $r && ' +
    svn_command + ' up -r ' + options.revision

tacが必要または有用であるとは確信していません。grep効率と美的な理由から、最初のスクリプトを Awk スクリプトにリファクタリングしました。

一般的な「私のxargs不足-r」問題を解決するには、解決策の要点は変換することです

stuff | xargs -r cmd

の中へ

var=$(stuff)
test "$var" && cmd $var

引用符$varなしは、スペースやその他の驚きのあるファイル名が含まれていない場合にのみ機能します。しかしxargs、GNU 拡張機能を持たない最低限の機能は同じ問題に悩まされます。

于 2014-06-08T10:06:12.790 に答える