Saya ingin menyalin konten variabel (di sini disebut var
) ke dalam file.
Nama file disimpan di variabel lain destfile
.
Saya mengalami masalah saat melakukan ini. Inilah yang saya coba:
cp $var $destfile
Saya juga mencoba hal yang sama dengan perintah dd ... Jelas shell mengira yang $var
merujuk ke direktori dan memberi tahu saya bahwa direktori tidak dapat ditemukan.
Bagaimana cara menyiasati ini?
$var
menentukan nama file atau beberapa teks yang harus ditulis ke file? Jika itu menentukan teks, lalu apa nama file yang Anda inginkan untuk menulis konten ini?$destdir
harus diberi nama$destfile
agar tidak menyesatkan ... Namanya$destdir
menyarankan itu menentukan direktori daripada file. Ini akan membuat seluruh pertanyaan Anda lugas dan mudah dimengerti.Jawaban:
Gunakan
echo
perintah:var="text to append"; destdir=/some/directory/path/filename if [ -f "$destdir" ] then echo "$var" > "$destdir" fi
The
if
tes yang$destdir
mewakili file.The
>
menambahkan teks setelah truncating file. Jika Anda hanya ingin menambahkan teks$var
ke file konten yang ada, gunakan>>
sebagai gantinya:echo "$var" >> "$destdir"
The
cp
Perintah ini digunakan untuk menyalin file (file), bukan untuk menulis teks ke file.sumber
]
dalam"$destdir"]
.echo
juga menambahkan baris baru trailing ke variabel Anda.$var
ada-e text to append
, dan tidak benar-benar menulis-e
echo $var
mengandalkan shell untuk memperluas variabel Anda, itu tidak akan berfungsi dengan baik dengan hal-hal seperti spasi dan karakter khusus. Anda dapat menggunakanperl -e 'print($ENV{var})'
sebagai gantinya, dan itu akan menghasilkan nilai variabel dengan tepat.echo
memiliki masalah jikavar
mengandung sesuatu seperti-e
, itu akan diartikan sebagai sebuah bendera. Opsi lainnya adalahprintf
, tetapiprintf "$var" > "$destdir"
akan memperluas karakter yang lolos dalam variabel, jadi jika variabel berisi garis miring terbalik, konten file tidak akan cocok. Namun, karenaprintf
hanya menafsirkan garis miring terbalik sebagai pelarian dalam format string, Anda dapat menggunakan%s
penentu format untuk menyimpan konten variabel yang tepat ke file tujuan:printf "%s" "$var" > "$destdir"
sumber
echo "$var" > destfile
salah.printf
lebih baik, lanjutkan.Tidak ada jawaban di atas yang berfungsi jika variabel Anda:
-e
-n
-E
\
diikuti dengann
dan karenanya tidak dapat diandalkan untuk konten string yang berubah-ubah.
Di bash, Anda dapat menggunakan "string di sini" sebagai:
cat <<< "$var" > "$destdir"
Seperti yang tertulis di komentar di bawah, jawaban @ Trebawa (diformulasikan di ruangan yang sama dengan saya!) Menggunakan
printf
pendekatan yang lebih baik.sumber
printf
overcat
adalah bahwa yang pertama adalah shell bawaan yang akan selalu dieksekusi lebih cepat daripada biner eksternal.Jika saya mengerti Anda benar, Anda ingin menyalin
$var
dalam file (jika itu adalah string).echo $var > $destdir
sumber
cp
perintah akan membuat shell menafsirkan argumen pertama sebagai nama file atau direktori.$var
tanda kutip, konten file tidak 100% sama dengan konten $ var dalam beberapa kasus. Misalnya ketika "echoing" vars yang berisi kunci RSA, Anda mendapatkan kunci yang tidak valid di file.$var
berisi spasi atau-e
Ketika Anda mengatakan "salin konten variabel", apakah variabel itu berisi nama file, atau apakah itu berisi nama file?
Saya berasumsi dengan pertanyaan Anda yang
$var
berisi konten yang ingin Anda salin ke dalam file:$ echo "$var" > "$destdir"
Ini akan menggemakan nilai $ var ke dalam file bernama $ destdir. Perhatikan kutipannya. Sangat penting untuk menyertakan "$ var" di dalam tanda kutip. Juga untuk "$ destdir" jika ada spasi di namanya. Untuk menambahkannya:
$ echo "$var" >> "$destdir"
sumber
var
mengandung-e
echo
mengakhiri daftar opsinya, dengan demikian menyelesaikan masalah yang diangkat oleh @Eric:echo -- "$var" >> "$destfile"
Semua pekerjaan di atas, tetapi juga harus mengatasi masalah (pelarian dan karakter khusus) yang tidak perlu terjadi di tempat pertama: Karakter khusus ketika variabel diperluas oleh shell. Jangan lakukan itu (ekspansi variabel) di tempat pertama. Gunakan variabel secara langsung, tanpa ekspansi.
Selain itu, jika variabel Anda berisi sebuah rahasia dan Anda ingin menyalin rahasia itu ke dalam sebuah file, Anda mungkin ingin tidak memiliki ekspansi di baris perintah karena tracing / perintah gema dari perintah shell mungkin mengungkapkan rahasianya. Artinya, semua jawaban yang digunakan
$var
dalam baris perintah mungkin memiliki potensi risiko keamanan dengan mengekspos konten variabel ke penelusuran dan pencatatan shell.Gunakan ini:
Artinya, jika ada pertanyaan OP:
printenv var >"$destfile"
sumber