curl
はバックスラッシュのエスケープを解釈しないため、参照する引数に実際の改行を挿入する必要がありますcurl
。つまり、シェル (bash
この場合) に を解釈させる\n
か、実際の改行を挿入する必要があります。
Posix 標準シェルは C エスケープを のように解釈しません\n
が、標準のユーティリティ コマンドprintf
は解釈します。ただし、bash
それを行う方法を提供します。引用形式では、$'...'
C スタイルのバックスラッシュ エスケープはインタープリターになります。それ以外の場合は、 と$'...'
同じよう'...'
に動作するため、パラメーターとコマンドの置換は行われません。
ただし、シェルを含むすべてのシェルbash
では、引用符内に改行を含めることができ、改行はそのまま渡されます。したがって、次のように書くことができます。
curl -s \
-F "token=$TOKEN" \
-F "user=$USER" \
-F "message=Root Shell Access on $HOST
$(date)
$(who)
" \
https://api.pushover.net/1/messages.json > /dev/null
(注: 元のコマンドから欠落していると思われるパラメーター展開を挿入しcurl
、非推奨のバッククォート コマンド置換を推奨される$(...)
形式に変更しました。)
上記のように、リテラル改行を含めることの唯一の問題は、外観を気にする場合、インデントが台無しになることです。したがって、bash の$'...'
形式を好む場合があります。
curl -s \
-F "token=$TOKEN" \
-F "user=$USER" \
-F "message=Root Shell Access on $HOST"$'\n'"$(date)"$'\n'"$(who)" \
https://api.pushover.net/1/messages.json > /dev/null
これも少し読みにくいですが、完全に合法です。シェルでは、セグメント間に空白がない限り、単一の引数 (「単語」) を任意の数の引用符付きまたは引用符なしのセグメントで構成できます。ただし、変数を事前定義することで、複数の引用符の構文を回避できます。
NL=$'\n'
curl -s \
-F "token=$TOKEN" \
-F "user=$USER" \
-F "message=Root Shell Access on $HOST$NL$(date)$NL$(who)" \
https://api.pushover.net/1/messages.json > /dev/null
最後に、printf
そのスタイルに慣れている場合は、標準のユーティリティを使用できます。
curl -s \
-F "token=$TOKEN" \
-F "user=$USER" \
-F "$(printf "message=Root Shell Access on %s\n%s\n%s\n" \
"$HOST" "$(date)" "$(who)")" \
https://api.pushover.net/1/messages.json > /dev/null