![기본 명령 문제](https://linux55.com/image/182678/%EA%B8%B0%EB%B3%B8%20%EB%AA%85%EB%A0%B9%20%EB%AC%B8%EC%A0%9C.png)
(학교 프로젝트의 경우) 이 명령들 사이의 차이점이 무엇인지 알아내려고 노력하고 있지만 제 경우에는 명령이 깨졌거나 실행하는 데 10분 이상 걸립니다~
따라서 샘플은 다음과 같습니다.
sudo find / -type f -exec 파일 '{}' grep '쉘 스크립트' |
차이점:
#{}에 "" 없음
-
sudo find / -type f -exec file {} \; | grep ’Shell script’ | wc -l
#아니요\
-
sudo find / -type f -exec file ’{}’ ; | grep ’Shell script’ | wc -l
#' ' 없는 grep 명령
-
sudo find / -type f -exec file ’{}’ \; | grep Shell script | wc -l
시간을 내어 도와주셔서 감사합니다.
답변1
'
먼저 스틸드라이버가 지적한 것처럼 인쇄된 따옴표가 아닌 직선 따옴표( )를 사용해야 합니다 .
둘째, 따옴표의 유무는 명령 자체에서 수신되는 내용에 영향을 미칩니다.
예를 들어 다음을 수행할 수 있습니다.
echo 'semicolon ; echo message'
여기서는 echo1 명령이 매개변수와 함께 실행됩니다 semicolon ; echo message
. 그러면 출력은 한 줄이 됩니다.
세미콜론; 에코 메시지
이제 따옴표가 없다고 가정합니다.
echo semicolon ; echo message
프로그램 echo는 정확히 같은 방식으로 실행됩니다(매개변수 인쇄). 그러나 차이점은 ;
쉘의 특수 문자로 인해 쉘 자체가 이 행을 두 개의 명령으로 다르게 처리한다는 것입니다.
- 에코 세미콜론
- 에코 메시지
출력은 다음과 같습니다:
세미콜론 메시지
귀하의 라인에서 인용할 수 있거나 인용하지 않을 수 있는 세 곳이 있습니다.
{}
상술 한 바와 같이GNU는 특정 셸에 대해 {}를 찾아 차단합니다. 어느 셸인가요? 최대셸은 독립적인 {}를 인용할 필요가 없으므로 아무런 효과가 없습니다.
;
find
;
A는 단일 매개변수를 완성하는 데 필요합니다 -exec
. ;
셸의 특성 으로 인해 따옴표로 묶어야 합니다( \;
, ';'
또는 로 ";"
인용해야 하며 이는 중요하지 않으며 리터럴로 인용하지 않아도 됩니다 ;
). 그렇지 않으면 쉘은 이를 find 명령 다음에 |
파이프( )로 시작하는 두 번째 명령 으로 해석하여 쉘 오류를 발생시킵니다.
예상치 못한 표시 '|' 근처에 구문 오류가 있습니다.
Shell script
당신 에게는 grep
매우 다른 두 가지 결과가 있습니다. 첫 번째 경우에는 Shell script
단일 인수( )를 사용하여 grep을 호출합니다. 다른 경우에는 두 개의 매개변수(first Shell
, second )를 사용하여 script
호출 됩니다. grep 작동 방식을 고려하면 첫 번째 경우 입력에서 받은 텍스트가 포함된 줄을 찾습니다.쉘 스크립트. 두 번째에서는 텍스트가 포함된 줄을 찾습니다.껍데기이름 아래에서는 script
완전히 다른 동작입니다 .
이 정보를 통해 어떤 행이 실행하기에 올바른 행인지, 왜 그렇게 작성되었는지 파악할 수 있습니다.
1은 실제로 쉘 내장 함수를 호출하지만 /bin/echo
독립적으로 실행된다고 가정합니다.
궁극적으로 올바른 경로는 세 가지 일을 합니다.
- 명령 실행
file
_시스템의 모든 파일에 대해` - (해당 파일을 설명하는) 텍스트가 포함된 줄을 선택하세요.쉘 스크립트
- 줄 수 계산(따라서 쉘 스크립트의 줄 수)
(마지막 명령은 를 사용하는 것과 동일합니다 grep -c
)
따라서 프로그램을 수천 번(파일 시스템의 각 항목에 대해 한 번씩) 실행한 후에만 명령의 출력(숫자)을 받게 됩니다.긴 실행 시간은 정상입니다.
건너뛴 폴더에서 실행할 수 있으므로 /
해당 하위 트리만 검색합니다.
tee /dev/stderr
그것이 무엇을 하는지 보는 또 다른 방법은 파이프에 삽입하는 것입니다:
find / -type f -exec file {} \; | tee /dev/stderr | grep "Shell script" | wc -l