GNU/Linux >> Belajar Linux >  >> Linux

Linux:Bagaimana cara menggunakan file sebagai input dan output secara bersamaan?

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:

  1. Shell membuka > file keluaran untuk menulis, memotongnya
  2. Shell mengatur agar file-descriptor 1 (untuk stdout) digunakan untuk keluaran itu
  3. Shell mengeksekusi uniq, mungkin seperti execlp("uniq", "uniq", ".bash_history", NULL)
  4. 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

Linux
  1. Cara Menggunakan Perintah Tar di Linux

  2. Cara Menggunakan Perintah Sentuh Linux + Contoh

  3. Cara Membuat Alias ​​​​dan Menggunakan Perintah Alias ​​​​di Linux

  1. Cara Mengarahkan Output ke File dan Stdout di Linux

  2. Bagaimana Menyalin File Dan Membuat Direktori Target Pada Saat Yang Sama?

  3. Bagaimana cara mengarahkan output dari perintah waktu ke file di Linux?

  1. Cara menangkap sesi terminal dan output dengan perintah skrip Linux

  2. Output Ke Stdout Dan Pada Saat Yang Sama Grep Ke File?

  3. Bagaimana Mendapatkan Input Dan Output Di Terminal Ke File Teks??