Saya mencoba masuk ke irb
sesi dengan variabel lingkungan spesifik dari file dengan perintah ini:
$ env $(cat env.sh) irb
Tetapi ketika saya mencoba tekan Tab
setelah saya mengetik env.
untuk menyelesaikannya, saya mendapatkan kesalahan berikut:
$ env $(cat env.-bash: unexpected EOF while looking for matching `)'
-bash: syntax error: unexpected end of file
Hal lain yang menarik adalah bahwa jika saya login sebagai root, kesalahan ini tidak terjadi.
Inilah output dari find ~ -uid 0
:
$ find ~ -uid 0
/home/(redacted)/.rpmdb
/home/(redacted)/.rpmdb/Group
/home/(redacted)/.rpmdb/Conflictname
/home/(redacted)/.rpmdb/Installtid
/home/(redacted)/.rpmdb/Sha1header
/home/(redacted)/.rpmdb/Providename
/home/(redacted)/.rpmdb/__db.002
/home/(redacted)/.rpmdb/Requirename
/home/(redacted)/.rpmdb/Sigmd5
/home/(redacted)/.rpmdb/__db.001
/home/(redacted)/.rpmdb/Obsoletename
/home/(redacted)/.rpmdb/.dbenv.lock
/home/(redacted)/.rpmdb/Name
/home/(redacted)/.rpmdb/Basenames
/home/(redacted)/.rpmdb/Triggername
/home/(redacted)/.rpmdb/Packages
/home/(redacted)/.rpmdb/Dirnames
/home/(redacted)/.rpmdb/__db.003
Adakah yang bisa menjelaskan kepada saya mengapa ini terjadi dan jika demikian, bagaimana cara memperbaikinya saat saya bukan pengguna root?
command-line
bash
auto-completion
Eldosoa
sumber
sumber
sudo su
.find ~ -uid 0
.~
adalah/home/something
.Jawaban:
Anda menemukan bug di perpustakaan Bash Completion yang digunakan oleh Ubuntu.
Apa artinya ini?
Ubuntu menggunakan pustaka penyelesaian bash untuk membuat penyelesaian bash pintar. Perpustakaan ini tinggal di
/usr/share/bash-completion/bash_completion
.Pada dasarnya, pustaka ini mendeklarasikan beberapa fungsi pintar yang tahu tentang perintah-perintah tipikal dan bagaimana menyelesaikannya. Setiap kali Anda menekan Tab, fungsi-fungsi dalam perpustakaan ini dipanggil dan berusaha untuk menyelesaikan baris perintah Anda saat ini. Jadi misalnya jika Anda mengetiknya
apt-get i
Tabakan menyelesaikan itu untukapt-get install
. Jika Anda tidak sumber perpustakaan itu, Anda hanya memiliki standar, penyelesaian bash primitif - jadi misalnya jika Anda mengetikapt-get i
Tabtanpa membuatnya, bash hanya akan mencari file di direktori saat ini dimulai dengani
dan mencoba untuk menyelesaikan perintah Anda sesuai dengan nama file ini.Mengapa itu tidak terjadi sebagai root?
Karena ketika Anda menggunakan
sudo su
untuk membuat sendiriroot
, pustaka penyelesaian bash tidak bersumber. Ini akan berbeda jika Andasudo -i
membuat sendiriroot
. Saya yakin Anda melihat bug itu, bukan? Lihat misalnya 'sudo su -' vs 'sudo -i' vs 'sudo / bin / bash' - kapan itu penting yang digunakan, atau apakah itu penting sama sekali? jika Anda tidak terbiasa dengan perbedaan.Dalam kasus saya, sebagai pengguna normal, pustaka akan bersumber ketika saya memulai Bash shell karena
~/.bashrc
sumber/etc/bash_completion
yang sumbernya/usr/share/bash-completion/bash_completion
.Jika saya gunakan
sudo -i
untuk masuk sebagairoot
, perpustakaan akan bersumber karena/etc/profile
sumber/etc/profile.d/bash_completion.sh
yang sumbernya/usr/share/bash-completion/bash_completion
.Mengapa bug itu terjadi?
Cobalah untuk menjalankan perintah ini:
Terlihat tidak asing? ;-) Memang, itulah yang terjadi di balik layar ketika Anda menekan Tabdalam konteks yang Anda gambarkan. Lebih tepatnya, bug ada dalam fungsi yang
_quote_readline_by_ref
dideklarasikan oleh/usr/share/bash-completion/bash_completion
. Jika Anda membuat sumber file itu, Anda harus memiliki fungsi itu tersedia. Jadi selanjutnya coba ini:Dengan argumen-argumen ini, fungsi
_quote_readline_by_ref
melakukan, antara lain, yangeval
disebutkan di atas. Anda dapat melihatnya jika mau. Dan ketika Anda mengetikenv $(cat env.
Tab, di balik layar yang berfungsi dipanggil dengan tepat argumen itu. Jadi itulah yang terjadi.Ini
eval
hack seharusnya untuk memperbaiki masalah lain , tapi saya kira itu diperkenalkan bug lain ini dalam proses.Bagaimana saya memperbaikinya?
Ternyata bug ini sudah dilaporkan . Setelah membaca laporan bug itu, saya melihat tiga cara untuk memperbaikinya:
Menambalnya: Di salah satu komentar dalam laporan bug itu, seseorang menyarankan untuk mengganti baris
dalam fungsi
_quote_readline_by_ref
dalam file/usr/share/bash-completion/bash_completion
dengan garisSaya merekomendasikan untuk tidak melakukan ini. Orang yang menulis komentar itu tampaknya bukan pengembang penyelesaian-bash . Perbaikan terbaru ini hanya akan menyebabkan operan kiri pernyataan untuk mengevaluasi ke salah dan dengan demikian mencegah hal itu
eval
terjadi. Namun tanpa pengetahuan yang baik tentang apa fungsi yang seharusnya dilakukan dan dalam konteks apa namanya, tidak jelas apakah ini tidak akan berpotensi merusak beberapa fungsi yang dimaksudkan lainnya.Dapatkan versi terbaru: Seperti yang juga disebutkan dalam laporan kutu itu, kutu ini tidak ada di git head (di mana di antara perubahan lainnya fungsi
_quote_readline_by_ref
tersebut telah disederhanakan). Anda dapat mengkloning revisi saat ini dari Git:... lalu salin versi terbaru
bash_completion
skrip ke/usr/share/bash-completion
(tidak perlu segera mencadangkan versi lama kecuali jika itu membuat Anda merasa lebih aman - jika Anda mengalami beberapa masalah,sudo apt-get install --reinstall bash-completion
kembalikan perubahan yang Anda buat dengan baik.) Ini adalah cara saya merekomendasikan jika Anda sedang terburu-buru untuk memperbaikinya. :-)Perhatikan bahwa tidak ada solusi yang akan membuat penyelesaian bash di dalam pekerjaan substitusi perintah: seperti yang disebutkan dalam laporan bug yang sama, ini rusak di Bash 4.3.
sumber
sudo su
untuk menjadi root, itu tidak sumber perpustakaan, tapi itu akan bersumber ketika Anda menggunakannyasudo -i
, yang merupakan cara yang dimaksudkan untuk mendapatkan sesi root interaktif. Adapun pertanyaan Anda: Karena bash shell membaca~/.bashrc
yang akhirnya sumber perpustakaan, dan tidak ada cara untuk "un-source" file, saya tidak melihat cara yang sepenuhnya mudah. Inilah kemungkinan hack: Buat sumber perpustakaan tergantung pada beberapa variabel lingkungan, katakanlahNOCOMPL
, tidak didefinisikan dalam~/.bashrc
, ...