これは機能するはずです。テストしたところ、期待どおりに機能しました。拡張、置換、または何を持っているかは発生しませんでした.
cat <<< '
#!/bin/bash
curr=`cat /sys/class/backlight/intel_backlight/actual_brightness`
if [ $curr -lt 4477 ]; then
curr=$((curr+406));
echo $curr > /sys/class/backlight/intel_backlight/brightness;
fi' > file # use overwrite mode so that you don't keep on appending the same script to that file over and over again, unless that's what you want.
以下を使用することもできます。
cat <<< ' > file
... code ...'
また、<< EOF
などのヒアドキュメントを使用する場合は注意が必要です。 、置換、変数展開などが行われます。したがって、次のようにします:
cat << EOF > file
cd "$HOME"
echo "$PWD" # echo the current path
EOF
常に変数 $HOME
の展開になります そして $PWD
.ホームディレクトリが /home/foobar
の場合 現在のパスは /home/foobar/bin
です 、 file
次のようになります:
cd "/home/foobar"
echo "/home/foobar/bin"
予想の代わりに:
cd "$HOME"
echo "$PWD"
最小限の変更のみが必要です。 <<
の後のヒアドキュメント区切り文字を一重引用符で囲みます .
cat <<'EOF' >> brightup.sh
または同等にバックスラッシュでエスケープします:
cat <<\EOF >>brightup.sh
あなたが発見したように、引用しないと、ヒアドキュメントは変数置換を受け、バッククォートが評価されます.
すべてではなく一部の値を展開する必要がある場合は、防止したい値を個別にエスケープする必要があります。
cat <<EOF >>brightup.sh
#!/bin/sh
# Created on $(date # : <<-- this will be evaluated before cat;)
echo "\$HOME will not be evaluated because it is backslash-escaped"
EOF
生産します
#!/bin/sh
# Created on Fri Feb 16 11:00:18 UTC 2018
echo "$HOME will not be evaluated because it is backslash-escaped"
@fedorqui によって提案されたように、ここに man bash
の関連セクションがあります :
ドキュメントはこちら
このタイプのリダイレクトは、区切り文字のみを含む (末尾の空白を含まない) 行が表示されるまで、現在のソースから入力を読み取るようにシェルに指示します。その時点までに読み取られたすべての行は、コマンドの標準入力として使用されます。
ヒアドキュメントの形式は次のとおりです:
<<[-]word
here-document
delimiter
word では、パラメーター展開、コマンド置換、算術展開、またはパス名展開は実行されません。 word の文字が引用符で囲まれている場合、区切り文字は word の引用符を削除した結果であり、ヒアドキュメントの行は展開されません。 単語が引用符で囲まれていない場合、ヒアドキュメントのすべての行がパラメータ展開、コマンド置換、算術展開の対象となります .後者の場合、文字シーケンス \<newline>
は無視され、\
文字 \
を引用するために使用する必要があります 、 $
、および `
.