ファイル名と一致するパターンを設定するときに、その文字を「明示的に」(つまり使用せずに)一致させるには/home/user/project/.git
どうすればよいですか?.
shopt -s dotglob
マニュアルは次の場所にあります。https://www.gnu.org/software/bash/manual/html_node/Filename-Expansion.html状態:
ファイル名拡張にパターンを使用する場合、シェルオプション dotglob が設定されていない限り、ファイル名の先頭またはスラッシュの直後の「.」文字は明示的に一致する必要があります。
「明確なマッチング」とは正確に何を意味しますか?
繰り返しますが、http://www.tldp.org/LDP/abs/html/globbingref.html(Notes
最後の部分で)同じ概念を解決します。
ファイル名拡張はドットファイルと一致しますが、パターンにドットがリテラル文字として明示的に含まれている場合にのみ可能です。
この注意は次の例を提供します。
~/[.]bashrc # Will not expand to ~/.bashrc
~/?bashrc # Neither will this.
# Wild cards and metacharacters will NOT
#+ expand to a dot in globbing.
~/.[b]ashrc # Will expand to ~/.bashrc
~/.ba?hrc # Likewise.
~/.bashr* # Likewise.
「ドットファイル」を含むように拡張された最後の3つの例の内部動作は理解できません。
b
具体的には、例の中の括弧内に「明示的な」一致を作成するにはどうすればよいですか?次の例は私にとってもっと曖昧です。文字とまったく関係のないように見える方法でパターンを操作すると、パターンが一致する結果を得ることができることを理解できません。.
~/.[b]ashrc
.
私がなぜそれを避けたいのかについてのこの質問の原動力は、shopt -s dotglob
私が他のプログラムの設定ファイルで使用するためにこれらのパターンを書いているという事実に由来します。 「隠しディレクトリ」などを含むパスを除外したいのですが、どのような方法でそれを指定.git
できるのかわかりません。dotglob
.
本質的に:「明示的」で文字を一致させる最も簡単な方法は何ですか?次の文字を括弧内に入れると「動作するようになります」。しかし、このアプローチでは、「暗闇の中で撮影」しているように感じる理由を知りたいです。
これに関して、潜在的な行動の説明をいただきありがとうございます。
以下を追加するように編集されました。
最初は関連性がないようですが、人々は私のユースケースの具体的な詳細に興味を持っているようで、さらに説明します。
私はホストベースの侵入検知ソフトウェアを使用していますSamhain
。 Samhainは、特定のカスタム設定パラメータに従ってファイルシステムが変更されるたびに「警告」します。
私いいえ.git
ディレクトリ内のファイル(一部の親ディレクトリにあります)が作成/修正/削除されたときにSamhainに警告するようにします。 Samhainでは、「ルールを無視する」を定義して、このタイプの除外を実行します。これらの規則の具体的な仕様は、次のトピックで説明されています。http://www.la-samhna.de/samhain/manual/filedef.html、存在する4.2. File/directory specification
。
簡単に言うと:
Wildcard patterns ('*', '?', '[...]') as in shell globbing are supported for paths. The leading '/' is mandatory.
そのため、関連ディレクトリと一致する「無視ルール」を作成しようとしましたが、.git
これにより実際にSamhainはそのディレクトリを監視アクティビティから除外するようになりました。
最初は次のように試しました。
[IgnoreAll]
dir = -1/home/user/project/*/*/.git
これはうまくいきません。 Samhainは、これらのディレクトリのファイルが変更されるたびに警告し続けます.git
。
上記で引用した例を見つけて、次のことを試しました。
dir = -1/home/user/project/*/*/.[g]it
この変更により、Samhainは必要に応じてこれらのファイルを無視します。
この質問を投稿するとき、なぜこの変更が望ましい効果を得たのか理解したかったのです。
もともと使用しようとしたパターンが「echo」でテストされたときに問題のディレクトリと一致したことを考慮すると、あまり.git
愚かではありません。
echo /home/user/project/*/*/.git
したがって、私はBashのパターンマッチング、ワイルドカード、またはファイル名拡張に関する基本的な知識を誤解していません。代わりに、この場合、Samhainがパターンマッチングを実装する方法に微妙な違いがあるようです。
Samhainのプロフィールに適用したとき、これがなぜ機能しないのかわかりません(明らかに)。この編集内容を見ると、誰かが説明できるはずです。
答え1
ファイル名拡張にパターンを使用する場合、シェルオプション dotglob が設定されていない限り、ファイル名の先頭またはスラッシュの直後の「.」文字は明示的に一致する必要があります。
これは単にglobを意味し、ファイル名の先頭のaと一致しませ*
ん。ファイル名の先頭にaを一致させるにはglobを使用できず、明示的に入力する必要があります。たとえば、?
[...]
.
.
.
$ echo ????
Work
$ echo .???
.gem .pki .ssh .vim
そして他の質問に答えるには:
b
具体的には、例の中の括弧内に「明示的な」一致を作成するにはどうすればよいですか?.
~/.[b]ashrc
globモードを使用しても必ずしもそうではありません。みんなパターンはもはや「明確」ではありません。たとえば、~/.[b]ashrc
文字は/.ashrc
明示的に一致します。しかし、[b]
これはグローバルパターンであり、明示的な一致ではありません。 (技術的には~
チルダ拡張であり、グローバル拡張の前に行われるため、明示的な一致も同様です。)しかし.
、する明示的なマッチングはまさに~/.[b]ashrc
マッチです~/.bashrc
。
~/?[b]ashrc
比較のため、いいえmatch ~/.bashrc
、.
もはや明示的な一致がないからです。
答え2
まず、パス名パターンで、および[b]
など?
が何を意味するかを知っていると仮定します。*
(そうでない場合はもう少し勉強してください。)
他の人が言ったことを繰り返す危険を冒して、あなたはそれを過度に考えているのです。文字列を含むパターン/.
(例:/
まもなくそれから.
) にはドットがリテラル文字として明示的に含まれます。ポイントは[b]
、?
および/または*
現在起こっています。後ろにこれ.
パターンがドットファイルと一致できるかどうかには影響しません。最後の 3 つの例を例として示します。模様
(つまり、通常のファイル/パス名だけでなく、複数のファイル/パス名と一致するか、まったく一致しない)は、~/.bashrc
最初の2つではなく一致します。会議一致する~/.bashrc
場合.
特別な扱いはありません。
それでは、あなたの本当の問題は何ですか?
...他のプログラムの構成ファイルで使用するためにこれらのパターンを作成しています。 「隠しディレクトリ」などを含むパスを除外したいのですが、どのような方法でそれを指定
.git
できるのかわかりません。dotglob
chown
すべてのファイル/ディレクトリ(たとえば、または)に対していくつかのタスクを実行したいようです。cp
とは別にドットで始まります。しかし、あなたのコードは他の人のスクリプトで使用されます(次のように)。.
またはコマンド)、スクリプトを「隠し」ファイルを含むすべてのファイルに拡張するように設定することsource
ができます。そして、既存のスクリプトの機能を中断したくないので、閉じたくありません。your_command *
dotglob
*
dotglob
よりスマートなワイルドカード(パス名拡張パターン)を使用してください。
ワイルドカード(別名ワイルドカード)について学んだことを願っています。たとえば、すべての文字と
[abc]
一致しますa
。たとえば、文字列は、とに一致します。 (たとえば、などの範囲でよく使用されます。)まあ、1つの特別なケースはすべての文字と一致します。b
c
c[aou]t
cat
cot
cut
d[iou]g
dig
dog
dug
[a-z]
[0-9]
[!abc]
とは別にa
、b
またはc
。したがって、[!.]*
(またはdirectory_name/[!.]*
)を使用して、ドット以外の文字で始まる名前を一致させることができます。逆説的に設定しないと[.]
(ファイル名の先頭に)ドットと一致しませんが、dotglob
[!.]
入らないようにする設定に関係なくポイントですdotglob
。dotglob
これは設定の有無にかかわらず同じ結果を提供します。dotglob
(サブシェルから)を使用してください。シェルオプションは
shopt
プロセスに対してローカルであり、プロセス属性は子プロセスから親プロセスに逆方向(上部)には流れません。だから(shopt -u dotglob;注文*)
実行できますyour_command
残りのスクリプトの設定と動作には影響を与えず、非表示のファイルにのみ適用されます。使用
dotglob
(サブシェルを使用せず)。一部の人々は追加のリソースを使用するので、サブシェルを避けることを好む。ただし、コストは最小限に抑えられます(実行ループで実行されない限り)。たくさん回)、これはあまり良い理由ではありません。サブシェルの使用を避けるためのより良い理由
cd
はumask
。これが発生した場合は、一時的に電源を切り、
dotglob
後で以前の設定を復元できます。またはなし
shopt dotglob
で入力すると、そのオプションの現在の設定が報告(表示)されます。 (そして-s
-u
dotglob
shopt
いいえパラメータは現在の設定を一覧表示します。みんなオプション。 )それに応じて終了状態も設定されます。この-q
フラグは表示を抑制するので、次のことができます。shopt -q ペナルティ glob_setting=$? をクリックします。 shopt -u ドットグローブ 注文* if ["$dotglob_setting" = 0] それから shopt -s ペナルティ フィリピン諸島
しかし、待って...「他のプログラムの構成ファイル」について話しています。何を言ってるの?同様のファイルの作成または変更について話している場合は、ignore=*.o
ファイルを処理するすべてのプログラムでファイルを処理(および解釈)するため、全体的な質問は意味がありません。そのプログラムそれを解釈する方法を決定します*
。シェルはそれとは何の関係もありません。
さて、今問題が何であるかをよりよく知ることができるようになりました。
簡単に言えば、あなたが見ている行動は言葉ではありません。.git
ディレクトリが存在する場合は、ディレクトリを正確に(文字通り)指定し、.git
ワイルドカード/グローバルパターンを使用して指定すると、.[g]it
動作は同じでなければなりません。
より長い答え:私は私の答えの最初のバージョンの最後の段落を支持します。 Samhainはポリシー設定ファイルを読み込み、解析中です。おそらく、設定ファイルのワイルドカードを解釈するためにシェルを使用しますが、内部的にはそうするようです。
そして、「シェルを使うこと」なら、どのシェルを使っていますか? Bashではなく、多くのシステムで/bin/sh
。パス名拡張パターン(ワイルドカードなど)の点では、デフォルトの動作は同じでなければなりませんが、ポーチから離れると沼に落ちます。シェルのPOSIX仕様にはコマンドもありません(私が知っている限り)、それを拡張するshopt
方法はありません。*
みんなファイル(隠されていないファイルだけでなく)。
感じたらごみこれに時間を費やして、Samhain設定ファイルを配置し、その /home/user/project/*
ファイルがすべてのファイルとして解釈されるのか、隠されていないファイルとして解釈されるのかを確認できます。それがすべてのファイルとして解釈されれば、私たちは結論を下すことができます
- Samhainは拡張ワイルドカードを使用しません
/bin/sh
。 - ワイルドカードを使用するための標準の基本規則(質問で詳しく説明した規則)はありません。
- 「Pathはシェルワイルドカードでワイルドカードパターン('*'、'?'、'[...]')をサポートしています。」アクション)は
*
すべてのファイルを意味します。 - それ可能ワイルドカードを拡張するには、モードでbashを使用してください
dotglob
。しかし、私が言ったように、私が知っているシェルの一般的な動作.git
と一致しません。.[g]it
ほぼ確実に独自のワイルドカードコードがあります。
しかし、それにもかかわらず、私はあなたの結論が正しいと自信を持って言うことができると信じています。 SamhainはIgnoreAll
仕様でワイルドカードを処理するのにエラーがあります。ベンダーにバグレポートを送信することもできます。それとも解決策を見つけたので、もう忘れてください。