Saya menggunakan vim untuk mengedit file. Terkadang, saya lupa memiliki izin yang sesuai. Saya menjalankan vim dan file sebagai file hanya baca. Saya dapat membuat perubahan, tetapi saya tidak bisa benar-benar menulis perubahan. Sesekali, saya akhirnya membuka file dan membuat perubahan padanya, menyadari bahwa saya tidak menjalankannya di sudo, berteriak pada diri saya sendiri, dan kemudian paksa berhenti dan membukanya lagi sebagai pengguna root.
Apakah ada solusi untuk ini? Bisakah saya memaksakan perubahan pada file meskipun status file hanya baca? Bisakah saya setidaknya menyimpan perubahan, menjalankan diff, dan menggabungkan file bersama?
linux
vim
terminal
permissions
andor kesselman
sumber
sumber
Jawaban:
Tampaknya ada beberapa pendekatan yang berbeda, tergantung pada masalah Anda saat ini:
:set readonly
Anda memiliki Anda bisa:w!
untuk memaksa menulis, atau:set noreadonly
lalu gunakan normal saja:w
:w !sudo tee %
. Ini akan menulis buffer ketee
, perintah yang menerima informasi pipa dan dapat menulis ke file. Dan saat tee dijalankan dengan kekuatan sudo, tee dapat memodifikasi file.:w! ~/tempfile.ext
untuk menulis perubahan Anda ke file sementara dan kemudian mengambil langkah-langkah untuk memindahkan file temp ke direktori (mengirim file temp ke pemilik direktori / admin).Anda dapat membaca lebih lanjut di sini:
Jalan pintas
Seperti yang sering menjadi masalah kasus # 2 ( masalah izin , dengan sudo ), Anda dapat ke
/etc/vim/vimrc
(atau~/.vimrc
) pintasan berikut:cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!
Kemudian Anda bisa mengetik
:w!!
untuk menghemat dengan kekuatan sudo . Saya tidak akan menjelaskannya di sini tetapi referensi di atas mencakup banyak cara pintas.sumber
Saya dapat memikirkan dua cara untuk melakukan ini.
Cara pertama mengasumsikan Anda memiliki file tersebut, tetapi file tersebut SIAP.
Cukup gunakan tanda seru vi's suffix ke perintah write (: w!) Untuk memaksa menimpa file READONLY Anda sendiri. Ini tentu saja mengasumsikan bahwa Anda memiliki izin untuk menulis dan mengeksekusi di folder saat ini.
akan menyebabkan vi untuk menimpa file READONLY yang asli.
Cara kedua mengasumsikan orang lain memiliki file tersebut, dan Anda ingin menyimpan perubahan Anda ke file itu.
Salah satu cara untuk mencapai ini adalah menyimpan perubahan yang dibuat ke file asli sebagai skrip ed dari dalam vi. Skrip ed ini dapat diterapkan ke file asli (atau file serupa lainnya) di lain waktu di luar vi dengan editor baris ed.
Cara untuk menyimpan sesi pengeditan saat ini sebagai skrip ed adalah dengan meneruskan nama file asli dan buffer vi yang diedit sebagai input standar ke utilitas berbeda dengan saklar baris perintah - yaitu menampilkan perbedaan sebagai skrip ed.
Jadi, dengan asumsi penyangga vi yang diedit, kemudian lakukan hal berikut
Ini menggantikan semua baris dalam buffer saat ini (., $!) Dengan skrip ed yang dihasilkan (diff --ed [original_file] -) yang diperlukan untuk mengubah file asli menjadi isi dari buffer saat ini. Kami kemudian ingin menyimpan skrip ed ini ke tempat yang aman, dan menerapkan skrip ke versi file asli yang dapat kami tulis. Jadi, simpan skrip ke lokasi yang dapat ditulisi, misalnya, folder masuk Anda:
Sekarang keluar vi, dan gunakan skrip ed ini untuk mendapatkan file yang diedit yang tidak dapat disimpan. Inilah cara untuk mencapai itu dari prompt baris perintah bash, '$':
Apa yang dilakukan urutan perintah ini dalam kata-kata adalah untuk menggabungkan skrip yang kita hasilkan dengan diff dan menggemakan perintah tulis ed, 'w', ke input standar ed. Ed kemudian menerapkan skrip ini ke salinan yang dapat ditulisi dari file asli, dan menulis perubahan buffer yang dimodifikasi itu kembali ke file.
Jadi itu adalah cara untuk menyimpan pekerjaan yang dilakukan di vi ke file yang semula dimiliki oleh orang lain menggunakan vi, diff, dan ed.
sumber
Hanya ingin menutup kasus ketika tidak ada izin menulis file.
Di sela-sela vim akan mengeluh tentang perubahan dalam file (karena perubahan bendera) - itu jelas aman untuk mengabaikannya
sumber
Kemungkinan lain, untuk kasus di mana Anda tidak memiliki hak sudo, adalah menggunakan
:w /somewhere/where/i/have/permissions/foo.txt
, dan kemudian menangani masalah izin nanti, seperti yang dilakukan Ryan Fox .sumber