bash 및 find에서 \는 무엇을 의미합니까?

bash 및 find에서 \는 무엇을 의미합니까?

나는 그것이 \이스케이프 문자라는 것을 알고 있지만 \bash에 글을 쓰면 다음과 같은 내용이 나타납니다.

System-Product-Name:~$ \
> 

그러면 bash는 몇 가지 지시를 기다립니까? 내가 사용할 때

System-Product-Name:~$ \
> ls

이것은 일이다. 하지만 내가 사용할 때

System-Product-Name:~$ cd Wideo \
> ls
bash: cd: too many arguments

그렇다면 백슬래시는 파이프처럼 작동합니까 |? 난 그렇게 생각하지 않아.

이 명령을 사용할 때:

find . -name "FILENAME"  -exec rm {} \;

왜 종료해야 합니까? 이 명령은 find올바른 파일을 찾아 해당 exec파일이 발견된 경로에서 제거하는 것 같습니다 . 이것이 없으면 제가 받은 정보는 -exec근거가 없고 이해할 수 없습니다. 왜 그냥 사용할 수 없나요?

find . -name "FILENAME"  -exec rm {}

?

나는 man find의 exec에 대한 정보만 가지고 있습니다.

exec는 -exec, -execdir, -ok 및 -okdir과 ​​관련된 진단 정보를 표시합니다.

그렇다면 exec를 사용할 때 왜 종료해야 합니까? 예를 들어 내가 사용할 때

find . -name "FILENAME"

종료할 필요는 없습니다.

답변1

\"이 줄은 줄의 끝이 아닙니다. 이 줄은 다음 줄에서 계속됩니다"(그러면 명령에 cd2개의 인수가 너무 많음)를 의미하는 줄 끝과 \다음 줄을 방지하는 줄 내부를 구별해야 합니다. 특별한 의미를 갖는 캐릭터.

그런 다음 \;귀하의 예에서는 find리터럴을 ;인수로 제공하는 것을 의미합니다. 그렇지 않은 경우 이는\ 쉘에 특별한 의미를 가지며 한 명령과 다음 명령 사이의 구분 기호로 사용됩니다.;find

이 매개변수는 옵션과 함께 사용할 때 필요하므로 ;와 함께 제공된 명령이 끝나는 위치를 알 수 있습니다. 또 다른 옵션은 두 매개변수의 합입니다. 자세한 내용은 설명서를 읽어야 합니다.find-execfind-exec{}+find(1)

답변2

이러한 방식으로 사용되는 \ 문자는 종종 다음 문자를 "이스케이프"한다고 부르므로 bash는 다음 문자의 특별한 의미를 제거하고 이를 bash 명령줄 처리의 일부가 아닌 리터럴 문자로 처리합니다. 바라보다https://stackoverflow.com/a/3871336/1663987bash 매뉴얼과 기타 정보를 참고하세요.

그래서

find . -name "FILENAME"  -exec rm {} \;

bash 명령 사이의 구분 기호로 처리하는 대신 find 명령 인수에 리터럴 세미콜론을 삽입하도록 bash에 지시합니다(ala echo hello; echo world).

~을 위한

ls some\ file

ls 인수를 구분하는 문자가 아닌 파일 이름의 일부로 공백을 처리하도록 bash에 지시합니다. 따라서 방금 사용된 것처럼 "some"과 "file"이라는 두 개의 서로 다른 파일 ls대신에 "some file"이라는 단일 파일의 출력이 표시됩니다 .ls some file

~을 위한

cd Wideo \
> ls

개행 문자를 명령의 끝으로 처리하는 대신 인수를 계속 찾도록 bash에 지시하므로 명령은 다음과 같이 표시됩니다 cd Wideo ls. 이 효과를 종종 줄 연속이라고 합니다.

답변3

"Bash에서는" 개행 문자를 이스케이프 처리합니다. find에서는 이스케이프됩니다 ;.

일반적으로 를 입력하면 Enter쉘은 이를 명령의 끝으로 읽습니다. \Enter문자 그대로 새 줄로 해석 하면 .

여기서 퍼즐의 두 번째 부분은 명령과 인수에 개행 문자가 포함될 수 있다는 사실을 깨닫는 것입니다. 할 수 없다는 규칙은 없습니다. 대부분의 사람들은 불편하기 때문에 사용을 기피합니다.

그러나 다음은 유효한 파일 이름과 ls유효한 cd인수입니다.

foo
bar

그냥 입력할 수는 없습니다.

cd foo
bar

셸에서 시도한 cd foo다음 실행합니다 bar. 하지만 할 수 있어야 합니다.

cd 'foo
bar'

이를 통해 find다음과 같은 구문을 갖게 됩니다 find -exec some_command. some_command공백이 포함될 수 있으므로 명령 이 끝나는 위치를 찾기 위해 find검색이 수행됩니다 . ;를 입력하면 find -exec bar ;bash는 호출이 ;끝났다고 생각하므로 find그냥 find로 전달됩니다 -exec bar.

리터럴 문자를 의미한다고 쉘에 알려주어야 합니다 ;. \;, 또는 을 사용하여 이 작업을 수행 할 수 있습니다 find -exec bar ';'. man find설명하다:

find에 대한 다음 인수는 모두 ';'로 구성된 인수가 나타날 때까지 명령에 대한 인수로 처리됩니다.

이는 매개변수가 ;명령 뒤에 와야 함 을 의미합니다 -exec.

관련 정보