Bash - "bash -c"를 통해 파이프를 사용하여 명령 문자열만 실행할 수 있는 이유는 무엇입니까?

Bash - "bash -c"를 통해 파이프를 사용하여 명령 문자열만 실행할 수 있는 이유는 무엇입니까?

다음 코드 예제에서는 문제를 보여줍니다.

bash -c "$(echo 'ls | wc -l')" # Working
"$(echo 'ls | wc -l')"         # Not working
$(echo 'ls | wc -l')           # Not working
'ls | wc -l'                   # Not working
'ls'                           # Working
ls | wc -l                     # Obviously working

내가 여기서 무엇을 놓치고 있는 걸까요?

답변1

"ls"셸에 실행할 텍스트 문자열을 제공하면 해당 문자열이 명령(예: 명령 이름이 아님)에 해당하면 "ls -l"해당 작업을 실행할 수 있습니다.

  • 첫 번째 예제는 echo실행 중인 명령이 호출 셸에 의해 실행되기 때문에 작동합니다 bash -c "ls | wc -l". 그런 다음 파이프는 에 의해 실행됩니다 bash -c.

  • 두 번째, 세 번째, 네 번째 예는 결과 텍스트 문자열에 추가 평가 단계가 필요하기 때문에 작동하지 않습니다 ls | wc -l. eval당신을 위해 그것을 할 것입니다.

"ls -l"또는 "ls | wc -l"작동하지 않는 이유는 참조 삭제가 발생하기 때문입니다.뒤쪽에명령줄 평가의 토큰화.

$(echo 'ls | wc -l')작동하지 않는 이유는 단어 분리 후에도 명령 대체가 발생하기 때문입니다.

관련 정보