HEREDOC을 "ruby -e"에 문자열로 전달하지 못하는 이유는 무엇입니까?

HEREDOC을 "ruby -e"에 문자열로 전달하지 못하는 이유는 무엇입니까?

이해할 수 없는 이유로 구분된 문서를 Ruby 인터프리터에 표현식으로 전달하는 것은 불가능해 보입니다.

$ ruby -e <<END
heredoc> puts 'hi'
heredoc> END

ruby: no code specified for -e (RuntimeError)

Perl에서도 같은 일이 일어나고, 고통스럽게도 Ruby와는 아무런 관련이 없습니다.

$ perl -e<<END
heredoc> print 'hi'
heredoc> END
No code specified for -e.

다음이 있는 경우에도 sed:

$ echo "blah" | sed -e <<END
pipe heredoc> s/.*/Hi/
pipe heredoc> END
sed: option requires an argument -- e
usage: sed script [-Ealn] [-i extension] [file ...]
       sed [-Ealn] [-i extension] [-e script] ... [-f script_file] ... [file ...]

Ruby에 구분 기호를 표현식으로 전달하는 방법은 무엇입니까? (또는 Perl이나 Sed...)

답변1

이는 거대한 문자열을 생성하여 매개변수로 전달하는 것이 "여기 문서"에서 수행하는 작업이 아니기 때문입니다. 일부 작업의 입력에 연결할 수 있는 스트림을 생성합니다.

구체적으로,

cat <<!
foo
!

같지 않음

cat foo

.

말하자면 cat, 그것은 우리에게 도움이 될 수 있습니다. 경고하다:아니요cat다음을 사용하면 아무 소용이 없습니다!

echo $(cat <<!
foo
!
)

봐, 우리할 수 있는cat제공된 here 문서에 적용된 명령 대체 덕분에 here 문서를 매개 변수로 전달합니다 .

답변2

이 시도:

$ perl -e "$(cat <<'EOF'
print 'qwerty';
EOF
)"
qwerty

perl실행하려는 프로그램을 확인 하려면 큰따옴표를 사용해야 하며 bash여기에서 문서를 확장해야 합니다.

$ perl -MO=Deparse -e "<<'EOF'
print 'qwerty';
EOF
"
'???';
-e syntax OK

perl입력이 문자열로만 이루어짐 을 알 수 있습니다 .

그리고 :catprocess substitution

$ perl -MO=Deparse -e "$(cat <<'EOF'
print 'qwerty';
EOF
)
"
print 'qwerty';
-e syntax OK

답변3

-e실행할 코드인 하나의 인수가 필요합니다. 개행 문자가 포함된 문자열을 사용할 수 있습니다. 이것은 나에게 가장 읽기 쉽습니다. Ruby, Perl, sed에 적용 가능

ruby -e '
  1.upto(10) do |n|
    p [n, n.even?]
  end
'

stdin을 통해 Ruby/perl 코드를 인터프리터에 전달할 수 있지만 파일 이름 인수를 전달할 수 없으며 stdin(*)에서 데이터를 읽을 수도 없습니다.

ruby <<'END'
  1.upto(10) do |n|
    p [n, n.even?]
  end
END

(*) 이건 역겨운 일입니다. 프로그램을 보낼 수 있습니다.그리고Ruby(및 Perl)의 DATA 파일 핸들을 사용하는 stdin의 데이터:

{
    cat <<'END'
while (<DATA>) {print +(split /:/)[0], "\n"}
__END__
END
    cat /etc/passwd
} | perl

관련 정보