私は7z(またはbash、まだわかりません)でやや奇妙な動作を経験しました。次のスクリプトを使用します。
#!/bin/bash
find /home/user -type f -name "*.pdf" | cut -c 10- > /home/user/exclude_list2.lst;
lst1=" -x@/home/user/exclude_list2.lst -xr!'*.config/*' -xr!'*.cache/*' "
command=$(/usr/bin/7z a $lst1 -v2048M arch0.7z /home/user);
$command
さらに、最後の2行は1行に簡単に置き換えることができます。
/usr/bin/7z a $lst1 -v2048M arch0.7z /home/user
私も次のことを試しました。
command="/usr/bin/7z a $lst1 -v2048M arch0.7z /home/dh ;"
"arch0.7z"ファイルを受け取りましたが、.configフォルダと.cacheフォルダは次のように含まれています。
#!/bin/bash
find /home/user -type f -name "*.pdf" | cut -c 10- > /home/user/exclude_list2.lst;
/usr/bin/7z a -x@/home/user/exclude_list2.lst -xr!'*.config/*' -xr!'*.cache/*' -v2048M arch0.7z /home/user ;"
正しく除外されたフォルダを含むファイルを作成します。
だから私は変数で拡張行の違いが何であるか疑問に思います。
/usr/bin/7z a $lst1 -v2048M arch0.7z /home/user
私が入力した内容は次のとおりです。
/usr/bin/7z a -x@/home/user/exclude_list2.lst -xr!'*.config/*' -xr!'*.cache/*' -v2048M arch0.7z /home/user
7zワークフローにこのような大きな変化が生じた理由はありますか?
答え1
あなたのオリジナルフォーム
command=$(/usr/bin/7z a $lst1 -v2048M arch0.7z /home/user);
$command
$command
含むという意味でしょう出力7zip 実行の一部として、var=$(...)
コマンド出力が変数に保存されます。
だから、
/usr/bin/7z a $lst1 -v2048M arch0.7z /home/user
交換ではなく、スクリプトエラーの修正です。
とにかく、本当の問題を直視してみよう。
シェルで変数の割り当てを実行すると、次のことを確認できます。
$ lst1=" -x@/home/user/exclude_list2.lst -xr!'*.config/*' -xr!'*.cache/*' "
-bash: !'*.config/*': event not found
"..."
したがって、二重引用符を使用すると、シェルは変数置換などを実行するため、この行にエラーがあります。問題のエントリは、!
bashがこのエントリを使用して履歴内の前のコマンドを参照するためです。代わりに一重引用符を使用してください。'...'
$ lst1=' -x@/home/user/exclude_list2.lst -xr!'*.config/*' -xr!'*.cache/*' '
$ echo $lst1
-x@/home/user/exclude_list2.lst -xr!*.config/* -xr!*.cache/*
答え2
これは私が予想しなかったことです。
lst1=' -xr@/home/me/exclude_list2.lst -xr!'*.config/*' -xr!'*.cache/*' -xr!'*.local/*' '
7z a $lst1 -v2048M arch0.7z /home/me
一重引用符を考えるときにトリックを実行します。-xr! '.config/'実際には引数の一部である変数の割り当てで終わります。また、私の変数が配列の場合はうまく機能します。
ところで「!」で脱出する。動作しません。 7z は「エラー: 無効なコマンドライン」というメッセージを表示します。