Saya mencoba untuk mengkompilasi wxWidgets menggunakan MingW, dan saya memiliki cygwin di jalan saya, yang tampaknya bertentangan. Jadi saya ingin menghapus /d/Programme/cygwin/bin
dari variabel PATH dan saya ingin tahu apakah ada cara yang elegan untuk melakukan ini.
Pendekatan naif adalah untuk menggemakannya ke file, menghapusnya secara manual dan sumbernya, tapi saya yakin ada pendekatan yang lebih baik untuk ini.
bash
shell
environment-variables
path
Devolus
sumber
sumber
Jawaban:
Tidak ada alat standar untuk "mengedit" nilai $ PATH (yaitu "tambahkan folder hanya ketika itu belum ada" atau "hapus folder ini"). Anda hanya menjalankan:
yang akan untuk sesi saat ini, jika Anda ingin mengubahnya secara permanen, tambahkan ke .bashrc, bash.bashrc, / etc / profile - apa pun yang sesuai dengan kebutuhan sistem dan pengguna Anda. Namun jika Anda menggunakan BASH, Anda juga dapat melakukan hal berikut jika, katakanlah, Anda ingin menghapus direktori
/home/wrong/dir/
dari variabel PATH Anda, dengan asumsi itu pada akhirnya:Jadi, dalam kasus Anda, Anda dapat menggunakan
sumber
/
dengan sesuatu seperti|
:PATH=$(echo "$PATH" | sed -e 's|:/d/Programme/cygwin/bin$||')
untuk mencegah semua pelarian.Dalam bash:
Jika Anda tidak menggunakan variabel perantara, Anda perlu melindungi
/
karakter di direktori untuk dihapus sehingga mereka tidak diperlakukan sebagai akhir dari teks pencarian.Baris pertama dan ketiga ada untuk mengatur agar setiap komponen dari jalur pencarian dikelilingi oleh
:
, untuk menghindari casing khusus komponen pertama dan terakhir. Baris kedua menghapus komponen yang ditentukan.sumber
Setelah mempertimbangkan pilihan lain yang disajikan di sini, dan tidak sepenuhnya memahami bagaimana beberapa dari mereka bekerja, saya mengembangkan
path_remove
fungsi saya sendiri , yang saya tambahkan ke.bashrc
:Ini berakhir cukup dekat dengan solusi Gilles tetapi dibungkus sebagai fungsi bash yang dapat dengan mudah digunakan pada baris perintah.
Ini memiliki keuntungan bahwa sebagai fungsi bash berfungsi seperti program tanpa harus menjadi program di jalur, dan tidak memerlukan program eksternal untuk dijalankan, hanya manipulasi string bash.
Tampaknya cukup kuat, khususnya tidak berubah
somepath:mypath/mysubpath
menjadisomepath/mysubpath
: jika Anda menjalankanpath_remove mypath
, yang merupakan masalah yang saya miliki denganpath_remove
fungsi saya sebelumnya .Penjelasan yang bagus tentang bagaimana manipulasi string bash bekerja dapat ditemukan di Advanced Bash-Scripting Guide .
sumber
Jadi, dengan menggabungkan jawaban dari @gilles dan @ bruno-a (dan beberapa trik sed lainnya), saya membuat one-liner ini, yang akan menghapus (setiap) REMOVE_PART dari PATH, terlepas dari apakah itu terjadi di awal, tengah atau akhir PATH
Agak sulit, tapi senang bisa melakukannya dalam satu pukulan. Ini
;
digunakan untuk bergabung bersama dua perintah sed terpisah:s@:$REMOVE_PART:@:@g
(yang menggantikan:$REMOVE_PART:
dengan tunggal:
)s@^:\(.*\):\$@\1@
(yang menghapus tanda titik dua utama dan akhir yang kami tambahkan dengan perintah echo)Dan di sepanjang baris yang serupa, saya baru saja berhasil membuat satu-liner ini untuk menambahkan ADD_PART ke PATH, hanya jika PATH belum mengandungnya
Ubah bagian terakhir menjadi
echo "$PATH:$ADD_PART"
jika Anda ingin menambahkan ADD_PART ke akhir PATH daripada ke awal....
... atau untuk membuatnya lebih mudah, buat skrip yang disebut
remove_path_part
dengan kontendan sebuah skrip yang disebut
prepend_path_part
dengan isinyadan sebuah skrip yang disebut
append_path_part
dengan isinyabuat semuanya dapat dieksekusi, lalu panggil mereka seperti:
PATH=$(remove_path_part /d/Programme/cygwin/bin)
PATH=$(prepend_path_part /d/Programme/cygwin/bin)
PATH=$(append_path_part /d/Programme/cygwin/bin)
Rapi, bahkan jika saya mengatakannya sendiri :-)
sumber
Lebih sederhana satu liner.
sumber
Merupakan latihan yang menarik untuk menulis fungsi bash untuk menghapus direktori dari variabel path.
Berikut adalah beberapa fungsi yang saya gunakan dalam file .bash * saya untuk menambahkan / menambahkan direktori ke path. Mereka memiliki kebajikan menghapus entri duplikat, jika ada, dan bekerja dengan segala jenis variabel jalur yang dipisahkan titik dua (PATH, MANPATH, INFOPATH, ...). fungsi remove_from menghapus direktori.
sumber
Di bawah ini adalah kode revisi dari solusi Greg Tarsa. Hanya perintah built-in bash yang digunakan di sini. Dengan demikian, ini akan menghemat banyak panggilan sistem fork ().
sumber
Untuk melengkapi / meningkatkan jawaban yang diterima dari Tushar, Anda dapat:
-e
opsi, sesuai halaman manual sed : "Jika opsi no -e, --expression, -f, atau --file diberikan, maka argumen non-opsi pertama diambil sebagai skrip sed untuk ditafsirkan."g
bendera (global) untuk menghapus semua kejadianPada akhirnya, ia memberikan sesuatu seperti ini:
sumber
Jawaban saat ini tidak menyelesaikan masalah saya yang serupa karena saya perlu menghapus banyak jalur. Semua jalur ini adalah sub-direktori dari satu direktori. Jika demikian, one-liner ini berfungsi untuk saya: (misalkan polanya adalah
cygwin
, yaitu menghapus semua jalur yang berisicygwin
)sumber