2012-05-31 65 views
1

這是將here文檔的內容分配給變量的一種方法。但是,它的執行將返回狀態1,但沒有說明原因。通過函數將Heredoc分配給變量的返回狀態1

#! /bin/bash 
# set -e -x 

# This implementation returns 1 
define(){ IFS='\n'; read -r -d '' ${1}; } 
define thedoc <<'EOF' 
Here is my here doc. 
There was an ASCII banana here too, 
but `read` would just it concatenate to mush. 
EOF 
# The here document will print with the following when `set -e` in not invoked. 
echo $thedoc 

只要set -e已關閉,一切都會通過檢查檢查甚至執行。這不是上面的香蕉專有的,而是上面的define()建立的任何這裏的文檔。從那裏出現錯誤?

+0

我不確定它是什麼意思,但是當我運行你的代碼時,所有'n's都被'thedoc'的值中的空格替換。 – chepner

+0

這種行爲是預期的。香蕉可能是一個不好的選擇。 :P – fny

回答

3

當你使用一個空字符串作爲分隔符read它本質上永遠看不到的分隔符,遇到結束的文件,因此它設置的返回狀態爲1,您可以使用while read循環來避免這種情況。

Bash Reference Manual

返回代碼是零,除非-的文件端遇到,read超時(在這種情況下,返回碼是大於128),或無效的文件描述符作爲參數提供給'-u'。

此外,請勿使用-e。使用明確的錯誤處理。請參閱BashFAQ/105

此外,爲了保留空格,製表符和換行符,而不是「拼接」,必須引用變量echo

相關問題