Bashを読むための-dオプションはどのように機能しますか?

Bashを読むための-dオプションはどのように機能しますか?

読み取りを使用して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でその一時ファイルを開きます(ターゲットコマンドがそのファイルを変数に読み込む場合)!願いより?私の考えでは、これは少し重複しています。

関連情報