変数(ここではと呼ばvar
れます)の内容をファイルにコピーしたいと思います。
ファイルの名前は別の変数に格納されますdestfile
。
これを行うのに問題があります。これが私が試したものです:
cp $var $destfile
私もddコマンドで同じことを試しました...明らかに、シェルはそれ$var
がディレクトリを参照していると考えていたため、ディレクトリが見つからないことがわかりました。
どうすればこれを回避できますか?
変数(ここではと呼ばvar
れます)の内容をファイルにコピーしたいと思います。
ファイルの名前は別の変数に格納されますdestfile
。
これを行うのに問題があります。これが私が試したものです:
cp $var $destfile
私もddコマンドで同じことを試しました...明らかに、シェルはそれ$var
がディレクトリを参照していると考えていたため、ディレクトリが見つからないことがわかりました。
どうすればこれを回避できますか?
$var
ファイル名またはファイルに書き込む必要があり、いくつかのテキストを指定しますか?テキストを指定している場合、このコンテンツを書き込むファイルの名前は何ですか?
$destdir
名前を付ける必要があり$destfile
ます...この名前$destdir
は、ファイルではなくディレクトリを指定していることを示しています。これにより、質問全体がまっすぐにわかりやすくなります。
回答:
次のecho
コマンドを使用します。
var="text to append";
destdir=/some/directory/path/filename
if [ -f "$destdir" ]
then
echo "$var" > "$destdir"
fi
if
テスト$destdir
ファイルを表します。
>
ファイルを切り捨てた後、テキストを追加します。$var
ファイルの既存のコンテンツにテキストを追加するだけの場合は、>>
代わりに次を使用します。
echo "$var" >> "$destdir"
このcp
コマンドは、テキストをファイルに書き込むためではなく、ファイルを(ファイルに)コピーするために使用されます。
]
inの間にスペースが必要"$destdir"]
です。
echo
また、変数に末尾の改行を追加します。
$var
isの場合-e text to append
、これは失敗し、実際には次のように記述されません-e
echo $var
は変数を展開するためにシェルに依存しているので、空白や特殊文字などではあまり機能しません。perl -e 'print($ENV{var})'
代わりに使用でき、変数の値を正確に出力します。
echo
のvar
ようなものが含まれている場合-e
、フラグとして解釈されるという問題があります。別のオプションはですがprintf
、printf "$var" > "$destdir"
変数内のエスケープ文字を展開するため、変数にバックスラッシュが含まれている場合、ファイルの内容は一致しません。ただし、printf
フォーマット文字列ではエスケープとしてバックスラッシュのみを解釈するため、%s
フォーマット指定子を使用して、正確な変数の内容を宛先ファイルに格納できます。
printf "%s" "$var" > "$destdir"
echo "$var" > destfile
間違いです。
変数が次の場合、上記の回答はどれも機能しません。
-e
-n
-E
\
後に続くn
そして、それらは任意の文字列の内容に依存することはできません。
bashでは、「ここの文字列」を次のように使用できます。
cat <<< "$var" > "$destdir"
以下のコメントで述べたように、@ Trebawaの回答(私の部屋と同じ部屋で作成!)を使用printf
する方がより良いアプローチです。
printf
上はcat
、前者は常に外部バイナリよりも速く実行されるシェルの組み込みであることです。
私があなたの言うことを正しく理解していれば$var
、ファイルにコピーしたいでしょう(それが文字列の場合)。
echo $var > $destdir
cp
コマンドを使用すると、シェルは最初の引数をファイルまたはディレクトリの名前として解釈します。
$var
引用符で囲まないと、ファイルの内容が$ varの内容と100%一致しない場合があります。たとえば、RSAキーを含む変数を「エコー」すると、ファイルに無効なキーが表示されます。
$var
スペースが含まれている場合、または失敗する-e
「変数の内容をコピーする」と言うとき、その変数にはファイル名が含まれていますか、それともファイル名が含まれていますか?
私はあなたがファイルにコピーしたい内容を$var
含む質問を仮定しています:
$ echo "$var" > "$destdir"
これにより、$ varの値が$ destdirというファイルにエコーされます。引用符に注意してください。"$ var"を引用符で囲むことが非常に重要です。名前にスペースがある場合の「$ destdir」も同様です。追加するには:
$ echo "$var" >> "$destdir"
var
含まれている場合は失敗します-e
echo
そのオプションリストを終了し、これ@Ericが提起した問題を解決しますecho -- "$var" >> "$destfile"
上記のすべてが機能しますが、最初に発生する必要のない問題(エスケープと特殊文字)を回避する必要もあります。変数がシェルによって展開されたときの特殊文字。そもそも(変数展開)それをしないでください。展開せずに変数を直接使用します。
また、変数にシークレットが含まれていて、そのシークレットをファイルにコピーする場合は、シェルコマンドのトレース/コマンドエコーがシークレットを明らかにする可能性があるため、コマンドラインで展開しないでください。$var
つまり、コマンドラインで使用するすべての回答は、変数の内容をシェルのトレースとロギングに公開することにより、潜在的なセキュリティリスクを持つ可能性があります。
これを使って:
printenv var >file
つまり、OP質問の場合:
printenv var >"$destfile"