シェルで直接うまく機能するtarコマンドラインがあります。
tar --exclude=out/pictures/\*.{jpg,gif,png,jpeg} --exclude=tmp/\*.{txt,php} --exclude=log/\*.{log,sql} -cvf /backups/mydomain.tar -C /var/www/vhosts/mydomain.com/httpdocs content
このコマンドをbashスクリプトに入れて実行すると、除外パラメータは無視されます。
私は次のようないくつかの異なる構文を試しました。
tar --exclude="out/pictures/\*.{jpg,gif,png,jpeg}" -cvf /backups/mydomain.tar -C /var/www/vhosts/mydomain.com/httpdocs content
tar --exclude='out/pictures/\*.{jpg,gif,png,jpeg}' -cvf /backups/mydomain.tar -C /var/www/vhosts/mydomain.com/httpdocs content
tar --exclude out/pictures/\*.{jpg,gif,png,jpeg} -cvf /backups/mydomain.tar -C /var/www/vhosts/mydomain.com/httpdocs content
tar --exclude= out/pictures/\*.{jpg,gif,png,jpeg} -cvf /backups/mydomain.tar -C /var/www/vhosts/mydomain.com/httpdocs content
しかし、何も動作しません。除外パラメータは単に無視されます。
単純な--excludeは--exclude="tmp"
期待どおりに動作します。パラメータの使用を開始すると、私が想定している構文が壊れます。
Ubuntu 18.04.5でtar(GNU tar)1.29を実行しています。
答え1
ブレーキ拡張はshではなくbashでのみ機能します。 Shebangがbashに設定されていることを確認してください。
#!/usr/bin/env bash
スクリプトを実行可能にして直接呼び出します。
chmod +x myscript.sh
./myscript.sh
コマンドの前にechoを追加して、いつでも拡張を確認できます。
echo tar --exclude=out/pictures/\*.{jpg,gif,png,jpeg} --exclude=tmp/\*.{txt,php} --exclude=log/\*.{log,sql} -cvf /backups/mydomain.tar -C /var/www/vhosts/mydomain.com/httpdocs content
答え2
まあ、今日は重要なことを学びました。
Bash シェルは中括弧拡張をサポートします。 shシェル(shはシェルですか?)しかしそうではありません。
私のようにスクリプトを実行すると、sh myscript.sh
shシェルを使用してスクリプトが実行されます。bash myscript.sh
すぐに適用されます。
しかし、shファイルのリンクに#!/bin/bash
bashを使用してスクリプトを実行させることはできませんか?
誰かがこれを説明できますか?少し混乱しています。
これを./script.shとして実行すると、カーネルは最初の行(shebang)を読み、次にbashを呼び出してスクリプトを解釈します。システムのデフォルトのshが使用するシェルを使用してsh script.shとして実行します(UbuntuではDashであり、shと互換性がありますが、Bashの一部のアドインはサポートされていません)。
それがすべてを説明しますが、私のUbuntuのデフォルトシェルecho $SHELL
はbashです(この引用は2010年のものなので、当時Ubuntuのデフォルトシェルはダッシュであると仮定します)。
に該当しても理解したいと思いますbash myscript.sh
。
答え3
試してみてください:
tar --exclude="out/pictures/*.{jpg,gif,png,jpeg}" -cvf /backups/mydomain.tar -C "/var/www/vhosts/mydomain.com/httpdocs content"