![여기에 문자열을 사용한 sed는 실패하지만 에코 출력이 sed로 파이프되면 성공합니다.](https://linux55.com/image/200769/%EC%97%AC%EA%B8%B0%EC%97%90%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%9C%20sed%EB%8A%94%20%EC%8B%A4%ED%8C%A8%ED%95%98%EC%A7%80%EB%A7%8C%20%EC%97%90%EC%BD%94%20%EC%B6%9C%EB%A0%A5%EC%9D%B4%20sed%EB%A1%9C%20%ED%8C%8C%EC%9D%B4%ED%94%84%EB%90%98%EB%A9%B4%20%EC%84%B1%EA%B3%B5%ED%95%A9%EB%8B%88%EB%8B%A4..png)
버전 sed
으로 업데이트 한 후 다음과 같이 명령 출력에서 공백이 쉼표로 바뀌지 않습니다 .4.4
sed
find
here-string
sed --version
sed (GNU sed) 4.4
ls -l /tmp/test/
total 0
-rw-r--r-- 1 root root 0 Jan 9 17:25 a
-rw-r--r-- 1 root root 0 Jan 9 17:25 b
# NOT EXPECTED
sed "s: :,:g" <<< $(find /tmp/test/ -type f)
/tmp/test/b
/tmp/test/a
sed
4.2 문제 없음
sed --version
sed (GNU sed) 4.2.2
ls -l /tmp/test/
total 0
-rw-r--r-- 1 root root 0 Jan 9 17:25 a
-rw-r--r-- 1 root root 0 Jan 9 17:25 b
# as expected
sed "s: :,:g" <<< $(find /tmp/test/ -type f)
/tmp/test/a,/tmp/test/b
해결 방법으로 결과를 변수에 저장하고 다음을 사용하는 것이 도움이 됩니다 echo
.
a=$(find /tmp/test/ -type f)
echo $a | sed "s: :,:g"
/tmp/test/b,/tmp/test/a
sed
4.4를 사용하여 동일한 출력을 얻으려면 어떻게 해야 합니까 here-string
?
고쳐 쓰다
bash 버전도 두 시스템 간에 변경되었습니다.
bash --version
GNU bash, version 4.4.20
구 버전
bash --version
GNU bash, version 4.3.48
답변1
이것은변화bash
버전 4.3과 4.4 사이
문서에서 계속해서 말하듯이 Bash는 더 이상 여기에서 문자열 확장을 분할하지 않습니다.
이전 코드의 버그에 의존했기 때문에 올바른 동작은 새 버전입니다.
이렇게 하면 쉼표로 구분된 파일 목록이 제공됩니다.
find -type f | tr '\n' , | sed 's/,$/\n/'
그러나 파일 이름 자체에 개행 문자와 쉼표가 포함될 수 있으므로 취약한 코드가 깨지기 쉽습니다. 새로운 질문에서 프로세스를 공유하려는 경우 누군가가 파일 이름을 안정적이고 안전하게 처리하는 더 나은 방법을 추천할 수 있을 것이라고 확신합니다.