!["grep -R mode"가 유효한 명령이 아닌 경우 뒤에서 무슨 일이 발생합니까?](https://linux55.com/image/136578/%22grep%20-R%20mode%22%EA%B0%80%20%EC%9C%A0%ED%9A%A8%ED%95%9C%20%EB%AA%85%EB%A0%B9%EC%9D%B4%20%EC%95%84%EB%8B%8C%20%EA%B2%BD%EC%9A%B0%20%EB%92%A4%EC%97%90%EC%84%9C%20%EB%AC%B4%EC%8A%A8%20%EC%9D%BC%EC%9D%B4%20%EB%B0%9C%EC%83%9D%ED%95%A9%EB%8B%88%EA%B9%8C%3F.png)
grep
검색할 파일 목록을 지정하지 않으면 grep
파일 이름을 지정할 때보다 속도가 훨씬 느리다는 것을 알았습니다(목록이 *
, 즉 디렉터리의 모든 파일임에도 불구하고).
-R
옵션을 사용할 때는 이런 일이 ( grep -R pattern
빠르게 ) 발생하지 않는 것 같습니다 grep -R pattern *
.
grep -R pattern
나는 입력 파일 목록 없이 전화를 거는 나쁜 습관에 빠졌습니다. 지금 사용하고 grep pattern
있는데 다음 사항이 알고 싶습니다.
grep -R pattern
명령이 유효하지 않은 경우 유효한 명령을 실행하기 위해 배후에서 어떤 일이 발생합니까 ?grep pattern
아니면 다시 말해 둘 사이의 차이점은 무엇입니까?
grep -R pattern
grep -R pattern *
grep pattern
답변1
GNU grep
와 일부 다른 구현에는 주어진 파일과 디렉터리를 재귀적으로 검색하게 하는 grep
비표준 옵션이 있습니다 .-R
grep
명령줄에서 다른 파일이나 디렉터리를 지정하지 않고 사용하면 GNU 구현은 암시적으로 현재 디렉터리를 사용합니다.-R
grep -R PATTERN
그러므로
grep -R PATTERN .
grep -R PATTERN *
이는 현재 디렉터리에 숨김 파일이 없거나 에서 dotglob
쉘 옵션을 설정한 것과 같습니다 bash
. dotglob
에서 셸 옵션을 설정 하지 않으면 명령줄의 패턴은 숨겨지지 않은 이름으로만 확장됩니다 bash
.*
다른 구현에서는 표준 입력을 재귀적으로 grep하는 것이 거의 의미가 없기 때문에 이것이 합리적인 기본값처럼 보이지만 암시적으로 with를 사용 grep
하지 않습니다 ..
-R
grep
OpenBSD를 예로 들어 보겠습니다 .
$ grep -R PATTERN
grep: warning: recursive search of stdin
grep
입력 파일 및 입력 파일 없이 실행하면 -R
유틸리티가 표준 입력을 읽게 됩니다. 모든 grep
구현이 이렇게 하는 이유는 다음과 같습니다.POSIX는 유틸리티가 다음을 수행해야 한다고 말합니다..
따라서 (완전히 유효한) 명령을 실행하십시오.
grep PATTERN
grep
어떤 입력 파일도 터미널의 입력을 기다리지 않습니다 . 를 사용하여 입력 종료 신호를 보내 Ctrl+D거나 를 사용하여 프로세스를 중단할 때까지 입력을 기다립니다
Ctrl+C.
표준 입력 스트림에서 읽는 것과 디렉터리 구조에서 일치하는 패턴을 반복적으로 검색하는 것은 상호 배타적인 작업입니다. 이렇게 해도 소용없어
somecommand | grep -R PATTERN
하지만
somecommand | grep PATTERN
완전히 합리적입니다.