다음 내용이 포함된 파일을 표시하려고 합니다.
!#abc
나는 이렇게 시도했다
grep -l '!#abc'
하지만 작동하지 않습니다. 왜?
또한 내가 다음과 같은 것을 시도하면
echo "#!a"
그것은 검색한다
echo "#alias".
누군가 여기서 무슨 일이 일어나고 있는지 설명해 줄 수 있습니까? #!무슨 뜻인가요? 실제로 대표?
답변1
당신은 작성해야합니다
grep \\!\\#abc <file>
#
기본적으로 및 를 이스케이프해야 합니다 !
. 이 두 문자는 거의 모든 셸에서 특별한 의미를 갖습니다. 이에 대해 자세히 알아보려면 셸 설명서를 읽어보세요.
답변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)를 제어합니다 #
. !
비대화형 쉘에서는 주석 문자가 항상 적용되며 기록 확장은 거의 항상 활성화되지 않습니다.