기본 명령 문제

기본 명령 문제

(학교 프로젝트의 경우) 이 명령들 사이의 차이점이 무엇인지 알아내려고 노력하고 있지만 제 경우에는 명령이 깨졌거나 실행하는 데 10분 이상 걸립니다~

따라서 샘플은 다음과 같습니다.

sudo find / -type f -exec 파일 '{}' grep '쉘 스크립트' |

차이점:

#{}에 "" 없음

  1. sudo find / -type f -exec file {} \; | grep ’Shell script’ | wc -l
    

#아니요\

  1. sudo find / -type f -exec file ’{}’ ; | grep ’Shell script’ | wc -l
    

#' ' 없는 grep 명령

  1. 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

관련 정보