Saya menjalankan instalasi Oneiric baru (yaitu bukan upgrade) pada dua sistem yang berbeda dan menjalankan ke set yang sama masalah yang tampaknya terkait.
Yang paling membuat frustasi dari kumpulan itu adalah, ketika saya menggunakan .profile dan .bashrc yang saya bawa dari Mac OS X, masuk ke X melalui LightDM segera mengeluarkan saya. Saya percaya ini disebabkan oleh fakta bahwa, ketika menjalankan "/ bin / sh", ia berperilaku sebagai / bin / dash, tetapi masih memiliki variabel $ SHELL yang disetel ke / bin / bash.
Ekstrapolasi
Saya punya yang besar .bashrc
. Anda dapat melihatnya di sini jika Anda mau, tetapi isinya mungkin tidak relevan, selain dari fakta bahwa itu penuh dengan bashisme, dan fakta bahwa ia berfungsi tanpa kesalahan di dalam xterm atau pada konsol virtual.
.profile
Penampilan saya seperti ini (disingkat):
case $SHELL in
*bash*)
if [ -f $HOME/.bashrc -a -r $HOME/.bashrc ]; then
. $HOME/.bashrc
fi
;;
esac
Jika saya mencoba masuk ke X melalui LightDM, itu akan segera log saya kembali. Saya mendapatkan kesalahan .xsession-errors
terkait dengan .bashrc saya yang terlihat seperti ini (disingkat):
/home/mrled/.bashrc: 103: [[: not found
[: 103: Linux: unexpected operator
[: 274: -P :: unexpected operator
/home/mrled/.bashrc: 520: complete: not found
Seperti yang saya katakan, ketika saya menjalankan bash dari konsol virtual, saya tidak mendapatkan kesalahan ini. Selain itu, jika saya menghapus .profile saya, saya dapat masuk ke X dengan baik. (Saya juga dapat masuk ke konsol virtual dan menggunakan startx
untuk memulai sesi X yang berfungsi, tetapi ini tentu saja bukan solusi jangka panjang.)
Namun, saya menemukan bahwa jika saya menjalankan /bin/sh -l
, saya tidak mendapatkan kesalahan. Berikut ini contoh sesi (catatan: bash prompt yang saya sederhanakan bash>
, dan sh prompt adalah adil $
):
bash> echo $SHELL
/bin/bash
bash> echo $BASH_VERSION
4.2.10(1)-release
bash> /bin/sh -l
/home/mrled/.bashrc: 103: [[: not found
[: 103: Linux: unexpected operator
[: 274: -P :: unexpected operator
/home/mrled/.bashrc: 520: complete: not found
$ echo $SHELL
/bin/bash
$ echo $BASH_VERSION
$
T1: Mengapa ini terjadi?
Saya mengerti bahwa / bin / sh sekarang menunjuk ke dash daripada bash , tetapi jika itu benar, lalu mengapa $SHELL
masih kembali /bin/bash
?
T2: Apa yang bisa saya lakukan untuk mengatasinya?
Apakah ada cara untuk mengatasi ini? Saya ingin agar profil saya tetap memuat .bashrc sehingga saya mendapatkan lingkungan yang sama pada shell login dan non-login, tapi jelas saya hanya ingin memuatnya untuk bash sendiri, bukan / bin / sh yang menyamar sebagai bash.
Anda mungkin telah memperhatikan perbedaan isi dari variabel $ BASH_VERSION di atas. Saya telah mencoba membungkus. Profil saya dengan sesuatu seperti ini:
if [ -n $BASH_VERSION ]; then
# the rest of my .profile as above
fi
The -n
uji harus kembali benar hanya jika panjang string adalah non-nol, bagaimanapun, meskipun dalam sesi di atas, ketika saya berjalan di bawah /bin/sh -l
itu mengembalikan string kosong untuk $ BASH_VERSION, ketika itu termasuk dalam .profile saya seperti ini , ini lulus ujian! Itu mereka hasilkan ke .bashrc saya dan beri saya kesalahan yang sama seperti sebelumnya.
Sekarang saya benar - benar bingung.
sumber
dash -l
juga menunjukkan$SHELL
memiliki nilai/bin/bash
.$SHELL
adalah apa pun bidang terakhir dalam/etc/passwd
(ataugetent passwd
) kata.~/.profile
, hal-hal khusus-bash di dalamnya~/.bashrc
, dan memiliki~/.bash_profile
sumber keduanya.Jawaban:
Anda dapat membuat fakta yang
$BASH_VERSION
kosongdash
untuk Anda:sumber
if [ "$BASH_VERSION" = '' ]
-n
saja , atau tidak sama sekali . (+1, meskipun.= ''
Berfungsi dengan sangat baik.)Anda hanya perlu menggunakan tanda kutip pada variabel yang
BASH_VERSION
akan digunakan-n
sumber
[ "$EMPTY_STRING" ]
bernilai false, Anda bahkan tidak memerlukannya-n
. Anda hanya perlu mengutip variabel.Gunakan
/proc/[PID]/cmdline
untuk melihat apa skrip sedang dijalankan dan menguji apa yang ada di dalamnya. The$$
variabel akan memberi kita PID dari shell berjalan. Jadi kita bisa membuat skrip seperti ini,Berikut ini tes skrip yang sama:
sumber
bash
namanya; itu tidak biasa untukbash
dieksekusi dijalankan melalui symlink dengan nama lain. Biasanya orang masih ingin mempertimbangkan Bash itu. Selain itu, polanya dicocokkan di mana saja di/proc/$$/cmdline
, yang seharusnya memungkinkan untuk diperbaiki, tetapi perlu diingat bahwa argumen dicmdline
adalah karakter-nol dibatasi.grep -qE '(^|/)bash$'
terasa seperti itu harus bekerja tetapi memberikan positif palsu ketika ada argumenbash
.