Intereting Posts
Dropbear сразу же отключает соединение на DD-WRT Невозможно настроить MariaDB в Arch Linux / Отказано в доступе для mysql_install_db после входа в систему ssh и во время обновления apt-get, неправильно ли выходить из системы? Как дублировать мой установочный раздел на раздел btrfs? Motif не отображает жирные или курсивные шрифты 'who –message' -> какое сообщение? Systemd не запускается после удаления зашифрованного раздела подкачки на Fedora 20 Я хочу отключиться автоматически, когда сигнал wpa_supplicant слаб Как сделать непрерывный wc -l с текстовыми инструментами gnu? Приводы не отображаются, когда sudo pvdisplay Могу ли я использовать один и тот же двоичный файл в Linux, * BSD и Illumos? Не удалось запустить запуск мини-куба на VMware Workstation 12 Какой файл занимает блок 123456789 на / dev / sda? Разделить двоичные данные фиксированного байтового смещения по байтовой позиции? Отменить изменения, внесенные в файлы в / usr / bin /

Почему передача HEREDOC в виде строки для `ruby -e` не работает?

По причинам, которые я не понимаю, представляется невозможным передать heredoc в качестве выражения интерпретатору 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 ...] 

Как передать heredoc в качестве выражения Ruby? (или Perl, или Sed …)

Это потому, что создание гигантской строки и передача ее в качестве аргумента – это не то, что делают «здесь документы». Они создают поток, который может быть подключен к входу какой-либо работы.

В частности,

 cat <<! foo ! 

не эквивалентно

 cat foo 

,

Говоря о cat , это может помочь нам здесь. Предупреждение: бесполезное использование cat следует!

 echo $(cat <<! foo ! ) 

См., Мы можем передать здесь doc в качестве аргумента, благодаря подстановке команд, примененной к cat которая была загружена здесь doc.

Попробуй это:

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

Вы должны использовать двойную кавычку для perl чтобы знать, какую программу запускать, и bash чтобы расширять этот документ.

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

Вы можете видеть, что perl видит ваш ввод только как строку.

При process substitution cat и process substitution :

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

-e требует аргумент, код для выполнения. Вы можете использовать строку со встроенными символами новой строки. Это для меня самое читаемое. Работает с ruby, perl, sed …

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

Вы можете передать код ruby ​​/ perl интерпретатору через stdin, но затем вы не можете передавать какие-либо аргументы имени файла и не можете читать данные из stdin (*)

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

(*) это довольно грубо: вы можете отправить программу и данные на stdin, используя ручку ruby's (и perl's) DATA:

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