Saya sering memodifikasi .bashrc saya dan kemudian sumber. Namun, ketika saya memiliki hal-hal seperti
export PATH="~/bin:~/perl5/bin:$PATH"
di file saya, maka PATH
variabel lingkungan tumbuh setiap kali saya sumber file.
Misalnya, pertama kali .bashrc bersumber, PATH
variabel terdiri dari ~/bin:~/perl5/bin:/usr/bin:/bin
.
Kali kedua terdiri dari ~/bin:~/perl5/bin:~/bin:~/perl5/bin:/usr/bin:/bin
.
Ketiga kalinya terdiri dari ~/bin:~/perl5/bin:~/bin:~/perl5/bin:~/bin:~/perl5/bin:/usr/bin:/bin
.
Apakah ada cara sederhana untuk membuatnya hanya menambahkan sesuatu yang belum ada di PATH?
/etc/profile
pada Debian Lenny, jadi saya memasukkannya ke dalam.bashrc
.pathmunge /some/path
akan ditempatkan/some/path
pada awal$PATH
danpathmunge /some/path after
akan ditempatkan/some/path
pada akhir$PATH
if ! [[ $PATH =~ (^|:)$1($|:) ]] ; then
.pathmunge /foo before
tidak mencapai itu. Cara yang lebih baik adalah menambahkan / foo di awal dan kemudian menghapus duplikat sesudahnya.Saya mengalami masalah ini jadi saya menggunakan kombinasi teknik yang tercantum pada pertanyaan StackOverflow . Berikut ini adalah apa yang saya gunakan untuk menyimpulkan variabel PATH sebenarnya yang telah ditetapkan, karena saya tidak ingin memodifikasi skrip dasar.
Anda selalu dapat mengoptimalkan ini sedikit lebih banyak, tetapi saya memiliki kode tambahan dalam sumber asli saya untuk menampilkan apa yang terjadi untuk memastikan bahwa pengaturan variabel yang benar. Hal lain yang perlu diperhatikan adalah saya melakukan hal berikut
Ini untuk memastikan bahwa saya dapat menangani direktori dengan spasi di (direktori home Samba dengan nama pengguna Active Directory dapat memiliki spasi!)
sumber
/bin
jika ada entri lain seperti/usr/bin
karena regexp cocok walaupun kedua entri tidak sama!Tetapkan jalur Anda secara eksplisit.
sumber
PATH
tidak selalu sama.Hanya satu string:
sumber
$PATH
. Saya suka meletakkan direktori tertentu di awal$PATH
(seperti/home/username
) sehingga salinan pribadi saya yang dapat dieksekusi dijalankan alih-alih bawaan bawaan.Saya dapat memikirkan dua cara berbeda untuk menyelesaikan ini. Yang pertama, adalah untuk memulai .bashrc Anda dengan garis yang secara eksplisit menetapkan PATH dasar Anda, dengan cara itu setiap kali Anda sumbernya, itu diatur ulang ke pangkalan sebelum menambahkan direktori tambahan.
Misalnya, tambahkan:
Sebagai alternatif, Anda dapat memeriksa item sebelum menambahkannya ke jalur. Untuk melakukan itu, Anda akan menggunakan sesuatu seperti:
Yang terakhir cenderung mendapatkan sedikit repetitif jika Anda menambahkan banyak entri, jadi saya cenderung tetap dengan yang pertama. Jika Anda ingin menggunakan ini dan berencana menambahkan banyak entri, menulis fungsi bash untuk menanganinya akan lebih bijak.
Catatan: Opsi kedua hanya dapat berfungsi seperti yang ditulis dalam versi modern bash. Dukungan ekspresi reguler bukan fitur Bourne Shell (/ bin / sh), dan mungkin tidak ada di shell lain. Juga, penggunaan tanda kutip mungkin tidak diperlukan atau bahkan dapat menyebabkan masalah pada beberapa versi terbaru dari bash.
sumber
PATH
tidak selalu sama.if
. Juga, secara mengejutkan (bagi saya) mudah untuk menjadikannya sebuah fungsi yang melompati argumen yang dipisahkan oleh ruang, jadi Anda bisa mengatakan:add_to_PATH ~/perl5/bin ~/.bin
unix.stackexchange.com/a/4973/28760 (saya kiracase
pernyataan yang digunakan lebih portabel) , tetapi Andaif
lebih jelas bagi saya). EDIT kebetulan aneh bahwa pertanyaan itu juga menambah perl5!Inilah solusi saya:
PATH=$(echo -n $PATH | awk -v RS=: -v ORS=: '!x[$0]++' | sed "s/\(.*\).\{1\}/\1/")
Satu liner mudah yang bagus yang tidak meninggalkan jejak:
sumber