Solusi 1:
echo "$(uniq .bash_history)" > .bash_history
harus memiliki hasil yang diinginkan. Subkulit dijalankan sebelum .bash_history
dibuka untuk menulis. Seperti yang dijelaskan dalam jawaban Phil P, pada saat .bash_history
dibaca di perintah aslinya, sudah dipotong oleh >
operator.
Solusi 2:
Saya sarankan menggunakan sponge
dari moreutils. Dari halaman manual:
DESCRIPTION
sponge reads standard input and writes it out to the specified file. Unlike
a shell redirect, sponge soaks up all its input before opening the output file.
This allows for constructing pipelines that read from and write to the same
file.
Untuk menerapkan ini pada masalah Anda, coba:
uniq .bash_history | sponge .bash_history
Solusi 3:
Masalahnya adalah shell Anda sedang menyiapkan pipa perintah sebelum menjalankan perintah. Ini bukan masalah "input dan output", itu konten file sudah hilang bahkan sebelum uniq berjalan. Bunyinya seperti:
- Shell membuka
>
file keluaran untuk menulis, memotongnya - Shell mengatur agar file-descriptor 1 (untuk stdout) digunakan untuk keluaran itu
- Shell mengeksekusi uniq, mungkin seperti execlp("uniq", "uniq", ".bash_history", NULL)
- uniq berjalan, membuka .bash_history dan tidak menemukan apa pun di sana
Ada berbagai solusi, termasuk pengeditan di tempat dan penggunaan file sementara yang disebutkan orang lain, tetapi kuncinya adalah memahami masalahnya, apa yang sebenarnya salah dan mengapa.
Solusi 4:
Trik lain untuk melakukannya, tanpa menggunakan sponge
, adalah perintah berikut:
{ rm .bash_history && uniq > .bash_history; } < .bash_history
Ini adalah salah satu cheat yang dijelaskan dalam artikel bagus “Di tempat” pengeditan file di backreference.org.
Ini pada dasarnya membuka file untuk dibaca, lalu "menghapusnya". Itu tidak benar-benar dihapus, meskipun:Ada deskriptor file terbuka yang menunjuk ke sana, dan selama itu tetap terbuka, file tersebut masih ada. Kemudian ia membuat file baru dengan nama yang sama dan menulis baris unik padanya.
Kerugian dari solusi ini:Jika uniq
gagal karena alasan tertentu, riwayat Anda akan hilang.
Solusi 5:
gunakan spons dari moreutils
uniq .bash_history | sponge .bash_history