Saya mencoba untuk rev
file dan kemudian pipa ke cat > same_file
tetapi file itu berubah menjadi kosong.
Sementara saya mencoba rev file.txt | cat > file2.txt && mv file.txt file2.txt;
itu berhasil.
Bahkan rev file.txt | cat >> file.txt;
berhasil.
Tetapi ketika saya mencobanya rev file.txt | cat > file.txt
gagal.
command-line
redirect
Vintux
sumber
sumber
cat
keluar seperti ini:rev file.txt > file2.txt && mv file2.txt file.txt
. Ini adalah penggunaan berlebihancat
. Dengan membiarkannya, Anda membiarkan proses ekstra.Jawaban:
Hal dasar yang perlu Anda pahami dalam kasus ini antara kedua cara pengalihan (> dan >>) adalah:
>
Arahkan ulang dan timpa informasi ke tempat yang ditunjuk. Ini terjadi ketika menerima informasi apa pun melalui pipa "|"
>>
Arahkan ulang dan menyatukan informasi yang ditunjuk. Ini terjadi ketika menerima informasi apa pun melalui pipa "|"
Dalam kedua kasus jika file tidak ada, itu akan dibuat sebagai gantinya. Hanya pada ">>" informasi akan digabungkan jika Anda menjalankannya lagi pada file yang sama. Dengan ">" Anda hanya akan menimpa semua yang Anda lakukan pada jalankan pertama.
Tapi di sini adalah kesepakatan ketika menggunakan file input yang sama dengan file output. Dalam kasus khusus itu, jika Anda menggunakan ">" Anda akan menghapus informasi yang bagian "input" perlu parsing, karena file output akan "menimpa itu". Jadi di:
Apa yang sebenarnya terjadi dalam "penjelasan gerak lambat" adalah:
rev
bersiap untuk membalikkan kontenfile.txt
dan mengirimkannya ke piparev
mengirim informasi ke pipa, pipa mengalirkannya langsung kecat
.cat
menerima informasi, ia akan secara otomatis menerapkannya ke informasifile.txt
yang telah ditentukan sebelumnya.cat
tidak akan menunggu untukrev
mem-pipe seluruh file. Ini hanya akan mulai saat bagian pertama dari informasi sampai ke sana, yang berarti, tergantung pada simbol apa yang Anda gunakan, itu akan membuka koneksifile.txt
.file.txt
sambil menunggu informasi baru untuk sampai ke sana. Dengan >> itu akan membuka koneksi denganfile.txt
dan menunggu informasi baru pada baris terakhir terdeteksi.file.txt
dengan > ,rev
akan mencoba melakukannya dan tidak mendapatkan apa-apa karenacat
menghapus semuanya sebagai persiapan untuk informasi baru.Jadi mengapa yang lain bekerja setelah membaca di atas. Karena ini:
Di sini Anda mengirim piping ke kucing yang mengirimkan informasi ke file lain . Dalam hal ini, file input yang diproses
file.txt
tidak sama dengan file outputfile2.txt
. Setelah itu Anda benar-benar Timpa seluruhfile2.txt
denganfile.txt
, sehingga semua proses yang dilakukan olehcat
telah dihapus. Pada dasarnya seluruh baris dapat disederhanakan seperticp file.txt file2.txt
karena ia melakukan hal yang sama karenafile2.txt
pada akhirnya kehilanganrev
dan ditimpa denganmv
perintah.Dalam hal ini Anda menggabungkan informasi ke file yang sama. Jadi itu hanya membuka koneksi ke file itu tetapi tidak menghapus informasi seperti yang terlihat dengan satu > . Hasil akhirnya seharusnya, informasi asli ditambah informasi terbalik.
sumber
rev file.txt | cat --bogus-option > file.txt
juga akan memotong file, meskipun kucing tidak akan berusaha membukanya.moreutils
) yang mencakupsponge
, alat yang dirancang khusus untuk penggunaan file yang ditimpa oleh file input. Misalnya,rev file.txt >file2.txt && mv file2.txt file.txt
solusi akan menjadirev file.txt | sponge file.txt
, yang akan bekerja dengan benar bahkan ketika sudah ada sesuatu yang dinamaifile2.txt
.Ketika shell melihat pengalihan, itu membuka file yang relevan terlebih dahulu, sebelum menjalankan salah satu perintah yang terlibat. Jadi, ketika Anda melakukannya:
Pengalihan ke
file.txt
menyebabkannya terpotong sebelumfoo
dijalankan dan dapat membacafile.txt
. Di samping catatan, inilah sebabnya Anda tidak dapat melakukan:Dan mengapa
sed
memiliki opsi pengeditan di tempat.Terakhir, melakukan:
adalah penggunaan kucing yang tidak berguna , terutama jika Anda mencoba membaca dari
file.txt
awal.Jika Anda ingin membalikkan file di tempat, tidak ada pintasan . Anda mungkin dapat menggunakan
sed
atauawk
trik dengan pengeditan di tempat.sumber
>
adalah redirector (operator) mengirimkan output ke sesuatu yang lain(input dari perintah berikutnya, printer ..)
Dalam kasus Anda, outputnya masuk ke file
file.txt
, jika file ini sudah ada itu ditimpa, jika tidak dibuat.>>
adalah operator append, jikafile.txt
sudah ada output ditambahkan ke akhir file. jika file tidak ada itu dibuat, dan output ditulis ke file baru, sama seperti>
(redirector).sumber
>
dan>>
operator.Anda dapat menggunakan Vim dalam mode Ex:
%
pilih semua baris!
jalankan perintahx
Simpan dan tutupsumber