Sysadmin unix tempat saya bekerja enggan memberi saya akses untuk mengubah shell login saya dari ksh
ke bash
. Dia telah memberikan berbagai alasan, yang paling lucu adalah karena mereka menulis semua skrip mereka untuk ksh
mereka tidak akan berfungsi jika saya mencoba menjalankannya. Saya tidak tahu dari mana dia mendapatkan ide-ide ini, tetapi karena saya tidak dapat meyakinkannya, apakah ada alternatif lain yang saya miliki?
(chsh
diinstal pada mesin ini, tetapi kami menggunakan pasangan kunci publik/pribadi untuk masuk, dan saya tidak memiliki kata sandi, jadi ketika chsh
meminta saya untuk kata sandi, saya tidak punya apa-apa untuk diberikan. )
Jawaban yang Diterima:
Saat Anda masuk, file ~/.profile
dibaca oleh shell login (ksh untuk Anda). Anda dapat menginstruksikan shell login itu untuk menggantikan dirinya sendiri dengan bash. Anda harus mengambil beberapa tindakan pencegahan:
- Hanya ganti shell login jika interaktif. Ini penting:jika tidak, masuk dalam mode grafik mungkin tidak berfungsi (ini bergantung pada sistem:beberapa tetapi tidak semua sistem membaca
~/.profile
saat masuk melalui xdm atau serupa), dan idiom sepertissh foo '. ~/.profile; mycommand'
akan gagal. - Periksa apakah bash tersedia, sehingga Anda masih dapat masuk jika file yang dapat dieksekusi tidak ada karena alasan tertentu.
Anda memiliki pilihan apakah akan menjalankan bash sebagai shell login atau tidak. Satu-satunya perbedaan utama dalam membuatnya menjadi shell login adalah ia akan memuat ~/.bash_profile
atau ~/.profile
. Jadi jika Anda menjalankan bash sebagai shell login, berhati-hatilah untuk memiliki ~/.bash_profile
atau berhati-hatilah untuk tidak mengeksekusi bash secara rekursif dari ~/.profile
. Tidak ada keuntungan nyata memiliki ~/.profile
dieksekusi oleh bash daripada ksh, jadi saya sarankan untuk tidak melakukannya.
Setel juga SHELL
variabel lingkungan ke bash, sehingga program seperti emulator terminal akan memanggil shell itu.
Berikut kode untuk beralih ke bash. Letakkan di akhir ~/.profile
.
case $- in
*i*)
# Interactive session. Try switching to bash.
if [ -z "$BASH" ]; then # do nothing if running under bash already
bash=$(command -v bash)
if [ -x "$bash" ]; then
export SHELL="$bash"
exec "$bash"
fi
fi
esac