Bash 및 sh 스크립트는 Here 문자열을 다르게 읽습니다.

Bash 및 sh 스크립트는 Here 문자열을 다르게 읽습니다.

내 코드에는 다음 줄이 있습니다.

    output=$(sed 's/\/$//g' <<< $output)

작동은 되지만 #!/bin/bash작동이 되지 않습니다 #!/bin/sh. sh프로그램 종료 시 오류 라인을 분석한 결과, 이것이 문제가 되는 부분 Syntax error: redirection unexpected이라는 결론에 도달했습니다 . <<<또한 vim에서 vim은 아래 코드가 <<<마치 문자열 안에 있는 것처럼 회색으로 표시합니다. 왜 이런 일이 발생하는지 알고 싶습니다. 미리 감사드립니다

답변1

<<<, zsh 연산자는 이제 일부 다른 셸(ZSH 포함)에서 지원되지만 여전히 언어의 표준 사양 bash에 추가되지 않았 으며 일부 구현에서는 여전히 이를 지원하지 않습니다.shsh

변수 내용에서 후행을 제거하려면 /다음을 수행하십시오.

output=${output%/}

대신, 이 코드처럼 ¹ /의 각 줄 끝에서 삭제 하려면 다음과 같이 하면 됩니다.$outputzsh

output=$(printf '%s\n' "$output" | sed 's|/$||')

또는 zsh의 here-string 대신 표준 here-doc를 사용하십시오.

output=$(
  sed 's|/$||' << EOF
$output
EOF
)

지원되는 쉘은 <<<다음과 같습니다:

  • zsh, 1991년부터
  • 1991년 기준 Byron Rakitzis의 rcUnix 클론(추가 개행 문자를 추가하지 않았음에도 불구하고) 및 파생 제품( es, akanga)
  • ksh93, 2002년부터
  • bash, 2002년부터
  • mksh, 2008년부터
  • yash, 2009년 이후( 호출 시 아님 sh)

sh2020년 5월 현재 이를 지원하지 않는 구현에는 Bourne 쉘 ksh88및 그 ash파생물(busybox, FreeBSD, NetBSD dash), OpenBSD가 포함됩니다.shpdkshposhshbosh


1 및 모든 후행 개행(추가된 개행 printf및 있는 경우 의 개행 $output)은 명령 대체의 부작용으로 결과에 포함됩니다. 예를 들어 (완벽하게 유효한 파일 경로) $output라면 .$'///\n/\n/'//

관련 정보