이해할 수 없는 이유로 구분된 문서를 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
입력이 문자열로만 이루어짐 을 알 수 있습니다 .
그리고 :cat
process 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