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
は `文字を受け入れることができますか?
編集2:quoted here-documentの回答を受け入れました<<'END_HELP'
、しかし kusalananda がこのような完全な手動出力に最終的に使用しない suggests
編集1:(将来の読み取り用)引用されたhere-documentは、here-document
でtput
を使用することを妨げます。
そのために、私は次のことを行いました。
here-document
、tput
コマンドを実行する場合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 ;
ここで、エラーの原因となったエスケープされたバックティックに注意してください。
\`.'
バックティックはコマンド置換を導入します。ヒアドキュメントは引用されていないため、これはシェルによって解釈されます。コマンド置換に終了バックティックがないため、シェルは文句を言います。
ヒアドキュメントを引用するには、
cat <<'END_HELP'
something something help
END_HELP
または
cat <<\END_HELP
something something help
END_HELP
この問題の解決に関するコメントについて:
ユーティリティが単独で完全なマニュアルを出力することはめったにありませんが、概要または基本的な使用法の情報が提供される場合があります。これはめったにカラー化されません(その出力がless
のような端末またはページャに送信されない可能性があるため)。実際のマニュアルは、しばしばgroff
または mandoc
のような専用のマンページフォーマッターを使用してタイプセットされ、コードとは別に処理されます。