다음 코드 예제에서는 문제를 보여줍니다.
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')
작동하지 않는 이유는 단어 분리 후에도 명령 대체가 발생하기 때문입니다.