12

システムのバックアップに使用するこのシェルスクリプトがあります。行があります:

tar -Pzcpf /backups/backup.tar.gz --directory=/ --exclude=proc --exclude=sys --exclude=dev/pts --exclude=backups --exclude=var/log / 2> >(grep -v 'socket ignored' >&2)

ご覧のとおり、私はこのブログ投稿を使用して、迷惑で役に立たない「ソケット無視」エラーをtarで除外しようとしています。

実行時にシェルから取得するものは次のとおりです。

/ bin / sysback:45行目:予期しないトークン>' /bin/sysback: line 45:tarの近くの構文エラー-Pzcpf / backups / backup --directory = / --exclude = proc --exclude = sys --exclude = dev / pts --exclude = backups --exclude = var / log / 2 >>(grep -v'ソケットは無視されます'>&2) '

4

4 に答える 4

25

使用した構文は、基本的なシェル構文の bash 拡張であるため、スクリプトを bash で実行するように注意する必要があります。(Ksh にも>(…)プロセス置換がありますが、リダイレクト後はサポートされません。Zsh で問題ありません。)

表示されるエラー メッセージを考えると、このスクリプトを bash で実行していますが、完全な bash モードではなく、POSIX 互換モードで実行しています。#!/bin/bash明示的な行でスクリプトを呼び出すように注意してください。#!/bin/shが bash へのシンボリック リンクであっても、実行しません。/bin/sh名前で呼び出された場合、bash は POSIX モードで実行されるためshです。bash 機能を使用する場合は、常に名前で bash を呼び出します。

また、bash 機能を使用する場合は、環境変数を設定したり、コマンド ラインでオプションPOSIXLY_CORRECTを渡したりしないように注意してください。--posix

または、この bash 固有の構文を使用しないでください。Stephane Rouberolによって提案されたような移植可能な構造を使用します。

于 2012-08-25T13:57:41.147 に答える
7

どうですか:

 tar -Pzcpf /backups/backup.tar.gz --directory=/ \
     --exclude=proc --exclude=sys --exclude=dev/pts \
     --exclude=backups --exclude=var/log 2>&1 | grep -v 'socket ignored'
于 2012-08-25T10:39:30.713 に答える
2

実際、GNU tar が「ソケット無視」警告を無視するオプションを提供している場合、std エラーでそのようなリダイレクトを行う必要はありません。

tar --warning='no-file-ignored' -Pzcpf /backups/backup.tar.gz --directory=/ --exclude=proc --exclude=sys --exclude=dev/pts --exclude=backups --exclude=var/log / 2> new.err

ここで、より多くの無視オプションを含む元のリンクを見つけることができます

于 2015-08-27T05:19:04.523 に答える