読み取りを使用してheredoc文字列を変数に割り当てようとするbashスクリプトがあり、オプションと一緒に使用するread
場合にのみ機能します。-d ''
read -d '' <variable>
スクリプトブロック
#!/usr/bin/env bash
function print_status() {
echo
echo "$1"
echo
}
read -d '' str <<- EOF
Setup nginx site-config
NOTE: if an /etc/nginx/sites-available config already exists for this
website, this routine will replace existing config with template from
this script.
EOF
print_status "$str"
私が見つけたSOへのこの答えここからコマンドをコピーすると機能します。ところで、なぜそうなのでしょうか?read
最初の改行文字に出会うと、最初の呼び出しが停止することがわかっているので、文字列に表示されないいくつかの文字を使用すると、heredoc全体が読み込まれます。
read -d '|' <variable>
- 働くread -d'' <variable>
--これではない
read -d ''
私はこれが簡単だと確信しています。しかし、このコマンドオプションでは何が起こっていますか?
答え1
問題はそれがうまくいくread -d ''
がうまくread -d''
いかない理由だと思います。
この質問は質問とは関係ありませんが、read
「問題」を引用しています。""
/文字列(単語)の一部として''
認識されません。シェルが見て/実行していることを示すようにします。
start cmd:> set -x
start cmd:> echo read -d " " foo
+ echo read -d ' ' foo
start cmd:> echo read -d" " foo
+ echo read '-d ' foo
start cmd:> echo read -d "" foo
+ echo read -d '' foo
start cmd:> echo read -d"" foo
+ echo read -d foo
答え2
あなたのheredocの内容は、次のように簡単に書かれています。
print_status(){ paste -sd\\n /dev/null - /dev/null;}
print_status <<\doc
doc body
doc
これらすべてを単一の名前に割り当てる必要はありません。その問題についてもっと簡単なのは次のとおりです。
print_status(){ printf %s\\n '' "$@" '';}
print_status \
'line 2' \
'line 3' and lines 4,5,6
私のポイントは、スクリプトファイルに多くのテキストを書き、次にシェルに一時ファイルを読み込むように指示することが少し多いことです。(一般的に、ここのドキュメントがどのように機能するかです)そして、いくつかのコマンドのstdinでその一時ファイルを開きます(ターゲットコマンドがそのファイルを変数に読み込む場合)!願いより?私の考えでは、これは少し重複しています。