2013-08-13 2 views
1

Прежде всего, у меня есть только один опыт работы с bash, поэтому мой вопрос может быть очень легким для большинства из вас. Вот мой вопрос: 2 кода, показанные ниже, выполняют одну и ту же работу, однако, благодаря I/O, в одном из них мне не нужно использовать команду echo. Я не понимаю, почему. Есть ли кто-нибудь, кто может мне помочь? Заранее спасибо.Bash standard I/O

#!/bin/bash 
# make_page ----- A script to produce an HTML file------ 

title="System information for" 

cat <<- _EOF_ 
    <HTML> 
    <HEAD> 
     <TITLE> 
     $title $HOSTNAME 
     </TITLE> 
     </HEAD> 

    <BODY> 
    <H1>$title $HOSTNAME</H1> 
    </BODY> 
    </HTML> 
_EOF_ 

второй, где я должен использовать эхо:

#!/bin/bash 

# make_page - A script to produce an HTML file 

echo "<HTML>" 
echo "<HEAD>" 
echo " <TITLE>" 
echo " The title of your page" 
echo " </TITLE>" 
echo "</HEAD>" 
echo "" 
echo "<BODY>" 
echo " Your page content goes here." 
echo "</BODY>" 
echo "</HTML>" 
+8

Первый документ [здесь] (http://en.wikipedia.org/wiki/Here_document). – devnull

+1

http://www.tldp.org/LDP/abs/html/here-docs.html – KBart

+0

http://www.gnu.org/software/bash/manual/bashref.html#Here-Documents – konsolebox

ответ

3

Первый скрипт использует cat (который в этом случае выводит все, что получает от ввода), а здесь doc <<. Здесь документы - это способ ввода команды в команду, как будто она получена из своего рода временного файла.

Здесь ссылка от man bash

Здесь Документы

Этот тип перенаправления выдает команду оболочки, чтобы прочитать входные данные от источника тока до строки, содержащей только разделитель (без завершающего пробелы). Все строки, считываемые до этой точки, - , затем используются в качестве стандартного ввода для команды.

Формат здесь-документов не является:

 <<[-]word 
       here-document 
     delimiter 

Нет расширения параметров, подстановки команд, арифметическое расширение, или подстановка имен файлов производится на слово. Если указаны какие-либо символы в слове , разделитель является результатом удаления цитаты в слове , а строки в этом документе не будут расширены. Если слово неуказано, все строки этого документа подвергаются параметру расширению, подстановке команд и арифметическому расширению. В последнем случае символьная последовательность \ игнорируется, а \ следует использовать для цитирования символов \, $ и `.

Если оператором переадресации является < < -, то все ведущие символы табуляции удаляются из строк ввода и строки, содержащей разделитель. Это позволяет здесь-документы в сценариях оболочки отступать в естественном режиме .

2

Если вы не передадите cat без имени файла (например, в вопросе), он будет читать со стандартного ввода. Код в вопросе перенаправляет стандартный ввод с <<-TAG ... TAG синтаксис из так называемого "here document", который написан внутри скрипта.

Затем cat выводит то, что он читает на стандартный выход, такой же, как echo.

Примечание: этот - в синтаксисе документа здесь имеет особое значение для удаления ведущих вкладок, позволяя отступом «здесь документ». Его можно было бы оставить без внимания и просто быть <<TAG ... TAG.

1

Альтернатива cat использует здесь-doc.Он по существу отображает содержимое целого файла (в данном случае здесь-doc). Если у вас есть файл, содержащий website.txt $ Название $ HostName

<BODY> 
    <H1>$title $HOSTNAME</H1> 
    </BODY> 
    </HTML> 

Вы можете просто запустить

кота website.txt

для достижения аналогичного эффекта. Также обратите внимание, что эхо, если бы было включено

$ title $ HOSTNAME

, отображать значения этих переменных (если они установлены), в то время как у кота нет.