"$(findmnt | grep "\""proc"\"" | head -n 1)" 길이가 0인 이유는 무엇입니까? (여기서 큰따옴표를 이스케이프 처리하기 위해 `"\""`를 사용하면 어떤 문제가 있나요?)

"$(findmnt | grep "\""proc"\"" | head -n 1)" 길이가 0인 이유는 무엇입니까? (여기서 큰따옴표를 이스케이프 처리하기 위해 `"\""`를 사용하면 어떤 문제가 있나요?)

제가 놀란 점은 다음과 같습니다.

$ if [ -n "$(findmnt | grep "\""proc"\"" | head -n 1)" ]; then echo 1; else echo 2; fi
2

"\""이 글을 읽은 후 IIRC 이전에 사용했습니다https://unix.stackexchange.com/a/187452/446998, 결국 작동합니다.

$ echo "1"\""2"\""3"
1"2"3

첫 번째 경우에는 왜 안되나요?

다시 방문하다쉘에서 따옴표를 이스케이프 처리하는 방법은 무엇입니까?그리고 허용된 답변을 따르려고 하면 반대의 문제가 발생했습니다. 존재하지 않는 설치를 찾는 것입니다.

$ if [ -n $'$(findmnt | grep "\proc111"\ | head -n 1)' ]; then echo 1; else echo 2; fi
1

내부적으로 grep 따옴표 없이 작동합니다.

~$ if [ -n "$(findmnt | grep proc111 | head -n 1)" ]; then echo 1; else echo 2; fi
2
~$ if [ -n "$(findmnt | grep proc | head -n 1)" ]; then echo 1; else echo 2; fi
1

제안 사항을 읽어 보았습니다.명령 대체에서 큰따옴표를 이스케이프하세요하지만 내 코드에 즉시 적용할 수는 없습니다.

답변1

문제는 큰따옴표가 잘못 이스케이프된 것이 아니라 "proc"출력이 일치하지 않는 것(큰따옴표로 묶음)인 것 같습니다 findmnt.

기본 출력은 for 및 for and (적어도 내가 본 모든 버전에서는) findmnt만 표시됩니다 ./procTARGETprocSOURCEFSTYPEfindmnt

findmnt -J출력하므로 "proc"표현식과 일치하지만 다시 jq.

관련 정보