どうしたの?

どうしたの?

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]\$'
echoechoシェル呼び出しを介してこのようなコマンドを出力できますが(これについては後でもう一度説明します)、エスケープをより多く使用して一重引用符がコマンドに到達することを確認する必要があります。

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 '

追加読書

答え2

キャラクターを消費できる要素には(少なくとも)2つのレベルがあります。

  1. シェル
  2. echoそれ自体

実行する場合:

echo "hello, \"world\""

あなたは出力を得る

hello, "world"

なぜならシェルエコーの代わりにバックスラッシュで二重引用符を使用します。シェルはそれをシェル構文として扱います。つまり、hello, "world"単一の引数としてechoに渡されます。次に、エコと改行文字を印刷します。

echo -e特にバックスラッシュシーケンスも解釈されます(実装によって異なります)。これを解決する簡単な方法はをprintf '%s\n' WHATEVER使用することですecho WHATEVER

ほとんどの場合、一重引用符を使用してシェルから何かを保護できます(一重引用符自体が含まれていない限り)。したがって、次のことができます。

printf '%s\n' 'PS1="[\t--------------------------------------------------------\n-\u@\h:\W]\$"'

これは作る:

PS1="[\t--------------------------------------------------------\n-\u@\h:\W]\$"

複数のステップのシェルエスケープで生き残る必要がある場合は、シェルprintf '%q\n' WHATEVERで生き残る形式で印刷することが役に立ちます(ただし、これはBash固有の機能である可能性があるため、まだ確認していません)。

注:一重引用符で囲まれた文字列内で一重引用符を保護する必要がある場合は、次の手順を実行する必要があります'\''

$ printf '%s\n' 'i'\''ll'
i'll

詳しくは実際には'i'++です。\''ll'

PS:PS1別の拡張が行われました(Bashのドキュメントを参照)\u。ただし、変数も拡張されます。したがって、最後に何かがある場合は、$これをエスケープする必要があります(サム二重引用符内にある場合は、バックスラッシュを使用してください。)PS1="foo\\\$PATH % "

答え3

使用printf:

printf '%s\n' 'PS1="[\t--------------------------------------------------------\n-\u@\h:\W]\$"' >> /home/unu/.bashrc

答え4

以下を簡単に使用できますcat

cat /var/tmp/ps1-file >> /home/unu/.bashrc

好みのエディタを使用して手動で作成できるため、ps1-file//で問題が発生するのを防ぎます。このファイルがノードに到達するには、以下を追加する必要があります。bashechoprintf文書部分。

file { "/var/tmp/ps1-file"
    source => 'puppet:///modules/bashrc/ps1'
}

これは、元のファイルをmodulepathできるとして指定しcontent =>ますが、これは自己引用/エスケープの問題を引き起こします。

関連情報