変数(ここでは)の内容をファイルにコピーしたいと思いvar
ます。
ファイルの名前は別の変数に格納されますdestfile
。
これを行うのに問題があります。これが私が試したことです:
cp $var $destfile
ddコマンドでも同じことを試しました...明らかに、シェル$var
はディレクトリを参照していると考えていたため、ディレクトリが見つからないと言われました。
これを回避するにはどうすればよいですか?
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
コマンドは、ファイルにテキストを書き込むためではなく、ファイルを(ファイルに)コピーするために使用されます。
echo
var
のようなものが含まれている-e
と、フラグとして解釈されるという問題があります。別のオプションはですprintf
がprintf "$var" > "$destdir"
、変数内のエスケープ文字を展開するため、変数に円記号が含まれている場合、ファイルの内容は一致しません。ただし、printf
バックスラッシュはフォーマット文字列のエスケープとしてのみ解釈されるため、%s
フォーマット指定子を使用して、正確な変数の内容を宛先ファイルに格納できます。
printf "%s" "$var" > "$destdir"
変数が次の場合、上記の答えはどれも機能しません。
-e
-n
-E
\
続き、n
したがって、任意の文字列の内容を信頼することはできません。
bashでは、「ヒア文字列」を次のように使用できます。
cat <<< "$var" > "$destdir"
以下のAshのコメントに記載されているように、@ Trebawaの回答(私のものと同じ部屋で作成されました!)を使用printf
する方が、よりも優れたアプローチですcat
。
上記のすべてが機能しますが、そもそも発生する必要のない問題(エスケープと特殊文字)を回避する必要があります。変数がシェルによって展開されるときの特殊文字。そもそもそうしないでください(変数展開)。展開せずに、変数を直接使用します。
また、変数にシークレットが含まれていて、そのシークレットをファイルにコピーする場合は、シェルコマンドのトレース/コマンドエコーによってシークレットが明らかになる可能性があるため、コマンドラインを拡張したくない場合があります。つまり、コマンドラインで使用するすべての回答は$var
、変数の内容をシェルのトレースとロギングに公開することにより、潜在的なセキュリティリスクを伴う可能性があります。
すでにエクスポートされている変数の場合は、次を使用します。
printenv var >file
つまり、OPの質問の場合:
printenv var >"$destfile"
注:変数名では大文字と小文字が区別されます。
警告:printenvで変数を出力するためだけに、変数をエクスポートすることはお勧めできません。シークレットを含むエクスポートされていないスクリプト変数がある場合、それをエクスポートすると、将来のすべての子プロセスに公開されます(たとえば、を使用してエクスポートされていない場合を除くexport -n
)。
$var
私があなたの言うことを正しく理解していれば、あなたはファイルにコピーしたいと思うでしょう(それが文字列の場合)。
echo $var > $destdir
「変数の内容をコピーする」と言うとき、その変数にはファイル名が含まれていますか、それともファイルの名前が含まれていますか?
私はあなたがファイルにコピーしたい内容$var
を含むあなたの質問によって仮定しています:
$ echo "$var" > "$destdir"
これにより、$varの値が$destdirというファイルにエコーされます。引用符に注意してください。「$var」を引用符で囲むことが非常に重要です。名前にスペースが含まれている場合は、「$destdir」の場合も同様です。追加するには:
$ echo "$var" >> "$destdir"