次の内容を含むファイルを表示しようとしています。
!#abc
私はこうしてみました
grep -l '!#abc'
しかし、うまくいきません。なぜ?
また、私が次のようなことをしようとすると
echo "#!a"
検索する
echo "#alias".
誰かがここで何が起こっているのか説明できますか? #!どういう意味ですか?実際に代表?
答え1
あなたは書く必要があります
grep \\!\\#abc <file>
#
デフォルトでは、およびをエスケープする必要があります!
。これら2つの文字は、ほぼすべてのシェルで特別な意味を持ちます。これについて詳しくは、シェルのドキュメントを読んでください。
答え2
まあ、grep:grep -l '!#abc'
処理するファイルのリストも必要です。
grep -l '!#abc' ./*
現在のディレクトリ内のすべてのファイルに適用されます。
echo:echo "#!a"
引用がもう少し必要です。たとえば、次のようになります。
$ echo '#!a'
#!a
$ echo '#'\!'a'
#!a
$ echo '#'\!a
#!a
$ echo "#!"a
#!a
$ echo "#"'!a'
#!a
$ echo $'#!a'
#!a
「#」はコメント文字です。からLESS=+'/^ *COMMENTS' man bash
:
コメント
In a non-interactive shell, or an interactive shell in which the interactive_comments option to the shopt builtin is enabled (see SHELL BUILTIN COMMANDS below), a word beginning with # causes that word and all remaining characters on that line to be ignored. An interactive shell without the interactive_comments option enabled does not allow comments. The interactive_comments option is on by default in interactive shells.
それ以降の内容は「コメント」とみなされ、処理されません。例:
$ echo one # two three
one
その効果を避けるには、それを引用するか、スペース以外の文字の後に置く必要があります。
$ echo one t# wo three
one t# wo three
彼は!
歴史上「核心人物」だ。
氷山の一角:ソースLESS=+'/^ *HISTORY EXPANSION' man bash
:
歴史拡張
歴史拡張は歴史拡張キャラクターの登場を通じて紹介されます!基本的に。バックスラッシュ()と一重引用符のみが歴史的拡張文字を引用できますが、歴史的拡張文字も二重引用符で囲まれた文字列で閉じる二重引用符の直前にある場合は、引用符として扱われます。
最後の質問は次のとおりですWhat does #! in fact represent?
。
答えはIt depends.
周辺のキャラクターによっても変わるということです。
引用の有無(および方法)によって異なります。先行スペースおよび/または末尾スペースがあるかどうかによって異なります。
正しく引用すると同じ文字になります。先行スペースなしで引用する場合:コメント。引用しない場合は、先行スペースもなく、後続スペースもありません。つまり、歴史的な拡張です。
引用符がない場合、先行スペースと末尾スペースはありません。
もちろんこれは仮想の選択です。
shopt -p interactive_comments
shopt -po history
どちらも決まった。それぞれは、対話型シェル内の対応する文字(and)を制御します#
。!
非対話型シェルでは、コメント文字は常に適用され、履歴拡張はほとんど常に有効になりません。