!["읽는 동안"이 터미널에서는 작동하지만 쉘 스크립트에서는 작동하지 않는 이유는 무엇입니까?](https://linux55.com/image/27597/%22%EC%9D%BD%EB%8A%94%20%EB%8F%99%EC%95%88%22%EC%9D%B4%20%ED%84%B0%EB%AF%B8%EB%84%90%EC%97%90%EC%84%9C%EB%8A%94%20%EC%9E%91%EB%8F%99%ED%95%98%EC%A7%80%EB%A7%8C%20%EC%89%98%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90%EC%84%9C%EB%8A%94%20%EC%9E%91%EB%8F%99%ED%95%98%EC%A7%80%20%EC%95%8A%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
루트 창의 제목을 설정하여 적용된 정보 텍스트로 WM 막대를 채울 때 이 흥미로운 문제에 직면했습니다.xsetroot -name "clever words"
이를 위해 터미널에서 운세를 인쇄하는 것이 효과적입니다.
fortune -s | while read -r; do xsetroot -name "$REPLY"; done
그러나 쉘 스크립트에서 실행하면 동일한 오류가 발생합니다.
#!/bin/sh
cat /tmp/afile | while read; do echo "$REPLY"; done
생산:
$ sh afilereader
afilereader: 2: 읽기: 인수 개수
물론 이는 부의 결과를 변수에 할당한 다음 해당 변수와 함께 xsetroot를 사용하여 해결할 수 있습니다. 하지만 난 아직도 이해하고 싶어왜이것은 스크립트에서 작동하지 않습니다.
파이프 양쪽의 각 명령이 자체 하위 쉘에서 실행된다는 것을 알고 있지만 해당 지역화된 변수가 while read 루프에 어떤 영향을 미치는지 확인할 수 없습니다. 아니면 루프 반복 사이에도 변수가 범위를 벗어나나요?
내가 놓친 게 무엇입니까?
고쳐 쓰다:내가 sh
사용하는 링크는 POSIX와 호환되는 dash입니다. 더 존경받는 사람들을 활용하면 bash
문제가 해결됩니다.
답변1
실행 중인 것으로 보이는 첫 번째 예 bash
와 가리키는 내용의 두 번째 예 /bin/sh
는 POSIX 셸이며 입력을 넣을 변수를 지정하는 인수를 전달해야 합니다. Shebang을 다음으로 변경하면 #!/bin/bash
문제가 해결됩니다.
답변2
sh 구문에는 다음이 필요합니다.
IFS= read -r REPLY
일부 셸(예: ksh, bash 및 zsh)에서는 read
변수 이름 없이 호출을 허용하지만 동작은 서로 다릅니다. 예를 들어 출력을 참조하세요.
printf 'te\ st\\\na ' | "$shell" -c 'read; printf "%s\n" "<$REPLY>"'
bash, zsh, pdksh 및 ksh93은 모두 다릅니다.