echo
を使用してPuppetルール内に行を追加しようとしていますが、.bashrc
引用符が正しくないようです。
'/usr/bin/echo -E PS1=\"[\t--------------------------------------------------------\n-\u@\h:\W]\$\" >> /home/unu/.bashrc'
これは私に次のような結果を与えます:
PS1="[t--------------------------------------------------------n-u@h:W]$"
もう一つの試み:
'/usr/bin/echo -E PS1="[\t--------------------------------------------------------\n-\u@\h:\W]\$" >> /home/unu/.bashrc'
これは私に次のことを与えます:
PS1=[\t--------------------------------------------------------\n-\u@\h:\W]$
もう一つ:
'/usr/bin/echo -e PS1="[\\t--------------------------------------------------------\\n-\\u@\\h:\\W]\\$" >> /home/unu/.bashrc'
これは私にこれを与えます:
PS1=[ --------------------------------------------------------
-\u@\h:\W]$
\
何らかの方法で"
説明しなければ、これを行う方法を見つけることができないようです。どうすればいいですか?
さらに引用符を使用しようとしましたが、これはPuppetに構文エラーが発生しました。
"/usr/bin/echo -e 'PS1="[\\t--------------------------------------------------------\\n-\\u@\\h:\\W]\\$"' >> /home/unu/.bashrc"
次の結果が得られた。
Error: Could not retrieve catalog from remote server: Error 500 on SERVER: Server Error: Syntax error at '' (file: /etc/puppetlabs/code/environments/production/modules/profile/manifests/ps1.pp, line: 3, column: 38) on node centoslave1
完全なコードは次のとおりです。
class profile::ps1 {
exec { 'myps1':
command => "/usr/bin/echo -e 'PS1="[\\t--------------------------------------------------------\\n-\\u@\\h:\\W]\\$"' >> /home/unu/.bashrc"
}
}
ベストアンサー1
どうしたの?
コマンド => "/usr/bin/echo -e 'PS1="[\\t------------------ -- ---------- ------ --------------------------\\N-\\u@\\h:\\W]\\ $"' >> /Home/unu/.bashrc"
何が間違っているのかを理解することがこれを正す手がかりです。=>
要素の右側(後ろ)は文字列でなければなりません。文字列はPuppetでさまざまな形式で提供されます。二重引用符で囲まれた文字列は二重引用符で始まり、2番目のセットで終わります。だからあなたの文字列は
"/usr/bin/echo -e 'PS1="その後、マニフェストに構文上の誤った横説説を追加できます。
[\ティー--------------------------------------------------- -- ------------- ---------\n-\u@\h:\W]\$そして別の文字列:
"'>>/home/unu/.bashrc"
正しく実行してください。
下から上に正しい設定を作成してください。コマンドがファイルに出力する内容から始めます。出力は、PS1
シェル変数を次のように設定するシェルコマンドです。
[\ティー--------------------------------------------------- -- ------------- ---------\n-\u@\h:\W]\$これらのコマンドは、単一引用符を使用してシェルがエスケープシーケンスをエスケープするのを防ぎます(ここでは、文字をエスケープする必要がないため、二重引用
\
符$
が優先されます)。PS1='[\t------------------------------- -- ----------- - ------------\n-\u@\h:\W]\$'
echo
echo
シェル呼び出しを介してこのようなコマンドを出力できますが(これについては後でもう一度説明します)、エスケープをより多く使用して一重引用符がコマンドに到達することを確認する必要があります。echo PS1=\''[\t---------------- -------------- ----------- ----\n-\u@\h:\W]\$'\'
しかし、これはecho
プラットフォームとシェル全体にわたって一貫した動作がないため問題になります(皮肉なことに)可能エスケープシーケンスの変換は実際にいいえあなたは何が欲しいですか?実際、質問のタグにもかかわらず、コマンドが実行されるシェルは、オペレーティングシステム(まだ指定されていない)に応じて、必ずしもBourne Againシェルである必要はありません。たとえば、Debian Almquist シェルです。より良い結果を得るには、次のようにしますprintf
。
printf "PS1='%s'\n" '[\t---------------------- - --------\n-\ u@\h:\W]\$' >> /home/unu/.bashrc
これまでは、実行のためにシェルに提供されたコマンドラインであると仮定していました。渡された引数は、シェルの規則に従って正しい内容になるようにエスケープされ、引用さecho
れます。printf
したがって、プロバイダへの問題のコメントに注意してください。
今コーディングする必要がありますそれ人形の文字列から。'
合計文字だけをエスケープする必要があるため、単一引用符で囲まれた文字列を選択することをお勧めします\
(これは次のとおりです)。シェル一重引用符文字列の規則(注):
コマンド => 'printf "PS1=\'%s\'\\n" \'[\\t------------- ------------- ------------------------ -\\n-\\u@\\h:\\W]\\$\ ' >> /home /unu/.bashrc '
追加読書
- 」言語:データ型:文字列」。Puppet 4.9 リファレンスマニュアル。 puppet.com.