setara dengan `setx` di Ubuntu

9

Windows memiliki perintah PowerShell yang disebut setxyang Menciptakan atau memodifikasi variabel lingkungan di lingkungan pengguna atau sistem.

Apakah Ubuntu memiliki perintah yang sama, yaitu tidak dengan menggunakan nanoatau vi, hanya satu baris untuk menambah atau memperbarui sistem variabel lingkungan lebar.

Solusi yang Diterapkan

Satu baris untuk menambah / memperbarui

grep env_name /etc/environment && sed -i.bak 's/env_name=.*/env_name="env_value"/' /etc/environment || echo 'env_name="env_value"' >> /etc/environment
Ayman
sumber

Jawaban:

12

Anda dapat melakukan ini hanya dengan mendeklarasikannya sebagai baru di baris perintah atau menyatakannya kembali. Misalnya, jika Anda ingin menambahkan ~/testfolderke variabel path Anda, Anda bisa memasukkannya di terminal Anda saat ini (ini hanya sebuah contoh):

PATH="$HOME/testfolder:$PATH"

Ini tentu saja hanya akan mengubahnya untuk waktu yang Anda katakan sesi terminal terbuka. Perhatikan $penggunaannya di sini, Anda tidak perlu deklarasi, tetapi jika Anda ingin menampilkannya, Anda perlu menambahkan $untuk memperluas isinya.

Jika Anda ingin mendeklarasikannya lebih tahan lama dan umum, Anda dapat menambahkannya ke dalam ~/.bashrcfile Anda (hanya untuk Anda) atau di /etc/bash.bashrc(seluruh sistem) misalnya jika Anda ingin mereka menghitung hanya untuk Anda atau untuk semua pengguna. Pilihan lain adalah menambahkannya ke .profilefile Anda (hanya untuk diri Anda sendiri) di mana ia akan layak dari saat Anda masuk. Anda dapat melakukan ini dengan echomisalnya jika Anda yakin variabel ini belum disetel atau jika Anda membuat yang baru (hanya sebuah contoh):

echo "variable=value" >> /path/filename

Namun jika Anda ingin mengedit file di luar direktori pengguna Anda yang merupakan kasus ketika Anda ingin mengedit /etc/bash.bashrcAnda perlu menggunakan sudodan jadi Anda tidak bisa cukup menggunakan 'di sini dokumen' karena ini tidak akan berfungsi, alih-alih gunakan kemudian baris seperti di bawah ini:

echo "variable=value" | sudo tee -a /path/filename

Namun jika variabel sudah ada, Anda dapat mengubahnya dengan sedperintah (juga hanya sebuah contoh):

sed -i.bak 's/variable=value/variable=new-value/' /path/filename

Ini akan mengedit variabel dalam file tetapi membuat cadangannya sebelum diedit. Jika Anda mengubah file di luar direktori pengguna Anda dengan sed, Anda perlu menggunakan sudosebagian besar kasus sehingga barisnya adalah:

sudo sed -i.bak 's/variable=value/variable=new-value/' /path/filename

Menghapus variabel dari file juga dapat dilakukan sed, biarkan bagian kedua dari regex kosong:

sed -i.bak 's/variable=value//' /path/filename

Jika Anda tertarik dengan variabel lingkungan mana yang disetel, Anda dapat menggunakan envperintah untuk mencantumkannya, ( set -o posix ; set ) | lessatau sh -c set. Ketiganya memberikan berbagai jumlah output, dengan ( set -o posix ; set ) | lessmemberikan kembali sebagian besar variabel yang sebenarnya ditetapkan.

Videonauth
sumber
1
Alih-alih ( set -o posix ; set )itu lebih sederhana untuk dikatakan sh -c set. Ini akan berfungsi meskipun shsymlink bash(yang biasanya tidak pada versi Ubuntu modern).
Ruslan
@ruslan sh -c settidak menunjukkan benar-benar semua variabel lingkungan yang ditetapkan pada sistem. Namun saya akan memasukkannya sebagai cara ketiga untuk menunjukkan beberapa dari mereka.
Videonauth
Sebenarnya sh -c setmenunjukkan semua variabel lingkungan . Itu hanya tidak menunjukkan variabel shell dari shell panggilan, tetapi ini tidak pernah diwarisi oleh proses yang Anda jalankan dari shell itu, kecuali Anda exportmereka.
Ruslan
Apakah ada yang pernah alasan yang sah untuk mengedit /etc/environment? Sepertinya itu jalan pintas menuju kebingungan.
Roger Lipscombe
@RogerLipscombe Terima kasih, tidak yakin tentang itu, ini masih merupakan tempat yang layak untuk mengedit variabel, tapi saya mengeluarkannya demi tidak menyebabkan kebingungan.
Videonauth
11

Tidak ada padanan langsung setx /m, tetapi ada cara untuk mencapai apa yang berhasil setx /m.

setx /mmenempatkan variable=valuedi HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment. Non- / m (yaitu per-pengguna) setxhanya menempatkan variable=valuedi HKCU\Environment.

Anda secara khusus meminta 'sistem lebar'. Untuk itu, Anda akan menambahkan pasangan nilai variabel ke /etc/environmentOR atau /etc/profile.d/<yourfile>. Yang pertama dievaluasi oleh pam, sedangkan yang terakhir dievaluasi oleh /bin/sh. Jadi, dalam /etc/profile.d/<yourfile>, Anda akan menambahkan variable=value; export variable. (pesta juga memungkinkan export variable=value). Untuk /etc/environmentAnda akan menambahkan variable=value.

Setara per pengguna adalah ~/.pam_environmentdan ~/.profile.

Lihat juga: https://help.ubuntu.com/community/EnvironmentVariables

Cyrus Patel
sumber
7

Anda dapat mengekspor variabel lingkungan pada baris perintah, tetapi itu tidak akan mempengaruhi lingkungan yang efektif dalam proses yang sudah dimulai, hanya dalam proses saat ini dan subprosesnya. Jadi dalam praktiknya Anda sering perlu login kembali ketika mengubah variabel lingkungan.

Gunnar Hjalmarsson
sumber