web-dev-qa-db-ja.com

不正な置換:ヒアドキュメントに「 `」を閉じません/ EOF

manスタイルの使用方法メッセージを出力して、この出力のようなシェル関数を説明しますman find

NAME
       find - search for files in a directory hierarchy

SYNOPSIS
       find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point...] [expression]

DESCRIPTION
       This  manual  page  documents the GNU version of find.  GNU find searches the directory tree rooted at each
       given starting-point by evaluating the given expression from left to  right,  according  to  the  rules  of
       precedence  (see section OPERATORS), until the outcome is known (the left hand side is false for and opera‐
       tions, true for or), at which point find moves on to the next file name.  If no  starting-point  is  speci‐
       fied, `.' is assumed.

OPTIONS

`文字のエラーメッセージが表示されます。
次の簡単なスクリプトはエラーを示しています:

~$ cat <<EOF
`.'
EOF

bash: bad substitution: no closing "`" in `.'

heredocは、引用符などの内容をエスケープする必要なく、文字列を貼り付けることでエコーするためのクールな方法でしたが...私は間違っていたと思います:/

誰かがこの動作を説明できますか? heredocは `文字を受け入れることができますか?

編集2quoted here-documentの回答を受け入れました<<'END_HELP'、しかし kusalananda がこのような完全な手動出力に最終的に使用しない suggests

編集1(将来の読み取り用)引用されたhere-documentは、here-documenttputを使用することを妨げます。
そのために、私は次のことを行いました。

  1. 引用符なしのhere-documenttputコマンドを実行する場合
  2. 代わりにバックティックをエスケープして、「悪い置換」エラーを回避します
  3. here-document内でtputを使用します

例:

normal=$( tput sgr0 ) ;
bold=$(tput bold) ;

cat <<END_HELP # here-document not quoted
${bold}NAME${normal}
       find - search for files in a directory hierarchy

${bold}SYNOPSIS${normal}
       find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point...] [expression]

${bold}DESCRIPTION${normal}
       This  manual  page  documents the GNU version of find.  GNU find searches the directory tree rooted at each
       given starting-point by evaluating the given expression from left to  right,  according  to  the  rules  of
       precedence  (see section OPERATORS), until the outcome is known (the left hand side is false for and opera‐
       tions, true for or), at which point find moves on to the next file name.  If no  starting-point  is  speci‐
       fied, \`.' is assumed.
END_HELP

unset normal ;
unset bold ;

ここで、エラーの原因となったエスケープされたバックティックに注意してください。

\`.'
5
el-teedee

バックティックはコマンド置換を導入します。ヒアドキュメントは引用されていないため、これはシェルによって解釈されます。コマンド置換に終了バックティックがないため、シェルは文句を言います。

ヒアドキュメントを引用するには、

cat <<'END_HELP'
something something help
END_HELP

または

cat <<\END_HELP
something something help
END_HELP

この問題の解決に関するコメントについて:

ユーティリティが単独で完全なマニュアルを出力することはめったにありませんが、概要または基本的な使用法の情報が提供される場合があります。これはめったにカラー化されません(その出力がlessのような端末またはページャに送信されない可能性があるため)。実際のマニュアルは、しばしばgroffまたは mandoc のような専用のマンページフォーマッターを使用してタイプセットされ、コードとは別に処理されます。

7
Kusalananda

あなたは何かを引用するために、シングルクォート/アポストロフィでバックティック/グレーブアクセントを明確に使用したいですか?しないでください、組み合わせはひどいです。ほとんどのフォントでは、バックティックは傾斜しており、(ASCII)アポストロフィは直線です。これは私のブラウザがあなたのマニュアルページスニペットの最後の行を表示する方法です:

enter image description here

垂直ASCII引用よりも洗練された引用を使用したい場合は、おそらく + 2018+ 2019 のようなものを使用する必要があります。 =。

出力はもちろんフォントによって異なりますが、「これ」は「これ」よりも見栄えが良いと思います。

4
ilkkachu