Bash에서 다양한 작업을 시도하고 있는데 이해할 수 없는 동작을 발견했습니다.
CODE="pwd";$CODE
이 코드는 잘 작동합니다.
CODE="pwd;pwd";$CODE
그러나 이것은 작동하지 않습니다. (분명히; &&와 동일하게 그것을 깨고 있습니다.)
어떤 아이디어가 있나요?
답변1
쉘은 $CODE
명령으로 실행됩니다. 경로에 이름이 지정된 명령을 생성하면 pwd;pwd
해당 명령이 실행됩니다. 이를 실행하려면 $CODE
다음과 같이 셸에 명시적으로 입력하세요.
CODE="pwd;pwd";sh -c "$CODE"
답변2
변수 확장은 명령줄 구문 분석보다 훨씬 늦게 발생합니다. 이 시점에서 변수 내의 값은 CODE
확장되지만 셸에서 다시 구문 분석되지는 않습니다. 또한 내부 값에 CODE
IFS 내의 문자가 포함되어 있지 않으면 값이 분할되지 않으며 쉘은 변수의 전체 내용을 하나의 명령으로 실행하려고 시도합니다. 물론 귀하의 경우에는 PATH에 호출된 실행 파일이 없으며 env;env
쉘이 할 수 있는 일은 해당 파일을 찾을 수 없다는 오류를 보고하는 것뿐입니다.
그러나 이것은 작동합니다(bash에서는).
CODE="pwd;pwd"; sh -s <<<"$CODE"
환경 변수로 자주 사용되는 대문자 변수는 사용하지 마세요. 그 지침을 따르도록 노력합시다.