TL; DR: Anda dapat menggunakan sudo -iuntuk menjalankan fungsi yang ditentukan /root/.bashrc(tetapi bukan alias) dan juga memiliki akses ke variabel yang diekspor dari file itu:
argumen perintah sudo -i
Meskipun demikian, alias tidak berfungsi di sana, tetapi Anda dapat dengan mudah mengonversinya ke fungsi jika Anda ingin membuatnya tersedia sudo -i.
Baca terus untuk analisis penuh dan detail lebih lanjut.
Ada beberapa masalah di sini, beberapa dalam cara kerja sudo dan beberapa dalam cara bash itu bekerja ...
Secara default, sudohanya akan mencari perintah dan akan memotong shell, jadi hanya menjalankan sudo llhanya akan bekerja jika ada yang dapat lldieksekusi di salah satu direktori di $PATH. Jadi, untuk menggunakan alias (atau fungsi), Anda perlu memastikan shell dipanggil sebagai bagian dari proses.
Salah satu caranya adalah dengan menjalankan sesuatu seperti sudo shatau sudo bash, meskipun modern sudo(saya menguji ini pada sudo 1.8.19p1) memiliki opsi -sdan -iuntuk tujuan itu.
Jadi satu percobaan akan menjadi sesuatu seperti sudo -s ll(yang setara dengan sudo bash -c 'll', dengan asumsi Anda $SHELLadalah Bash, yang tampaknya menjadi kasus berdasarkan yang rcfileAnda sebutkan.) Tapi itu tidak berhasil, karena ia memulai shell dalam non-interaktif, mode non-login, yang tidak membaca file startupnya. Ini pada dasarnya sama seperti jika Anda menulis skrip shell dan menggunakannya #!/bin/bashuntuk menjalankannya. Alias (dan fungsi) yang Anda miliki di Anda ~/.bashrctidak akan dapat diakses dari skrip itu ...
Jadi selanjutnya adalah -iopsi, yang menciptakan shell login. Itu lebih menjanjikan, karena akan membaca file startup Anda! Namun, sudo -i ll(setara dengan sudo bash -l -c 'll') masih tidak akan berfungsi. Jadi bagaimana mungkin, mengingat memang membaca definisi llalias?
Nah, penjelasan selanjutnya di sini adalah bahwa, secara default, bash tidak akan memperluas alias, kecuali ketika shell bersifat interaktif ... Shell ini dimulai dengan sudo -i(atau bash -l) shell login , tetapi masih belum interaktif.
Jadi langkah selanjutnya adalah mendapatkan shell interaktif , yang kemudian berfungsi :
sudo bash -i -c 'll'
(Memiliki kedua login dan interaktif juga baik, tentu saja, bash -l -i -c ...akan berfungsi.)
Alternatif lain adalah tetap menggunakan shell login (non-interaktif) tetapi memintanya secara eksplisit untuk memperluas alias, jadi ini juga akan berfungsi:
sudo bash -l -O expand_aliases -c 'll'
(Kasus di mana bash bersifat interaktif tidak memerlukan shell login , karena itu sudah cukup untuk membaca file inisialisasi, tetapi yang ini perlu -lmembacanya.)
Ini adalah baris perintah yang cukup panjang ... Dan mereka juga mengharuskan Anda mengutip seluruh perintah shell, jadi jika Anda memanggil alias dengan argumen, Anda harus mengubah semua itu menjadi string ... Jadi itu semacam kikuk untuk menggunakan ...
Perhatikan bahwa sebelumnya saya berbicara tentang alias dan fungsi ... Itu sengaja, karena fungsi sebenarnya jauh lebih nyaman di sini. Anda tidak perlu sesuatu yang istimewa (seperti memiliki shell interaktif, atau mengatur opsi tertentu) untuk menjalankan fungsi pada shell, selama Anda mencari definisi mereka.
Jadi, jika Anda mendefinisikan llsebagai fungsi alih-alih alias, Anda dapat menggunakannya secara langsung dengan -ipintasan sudo :
sudo -i ll
Dan jika Anda memiliki baris perintah yang lebih panjang, dengan argumen, Anda bisa meneruskannya langsung di sini juga:
sudo -i ll -C -R /etc
(Bandingkan dengan sudo bash -i -c 'll -C -R /etc'.)
Fungsi juga jauh lebih fleksibel dan biasanya lebih mudah dipelihara ... Biasanya mudah untuk mengubah alias menjadi fungsi, satu-satunya peringatan adalah untuk selalu menggunakan di "$@"mana Anda mengharapkan argumen tambahan akan diambil (biasanya di akhir alias.)
Misalnya, alias ini:
alias ll='ls $LS_OPTIONS -l'
Dapat diubah menjadi fungsi ini:
ll () {
ls $LS_OPTIONS -l "$@"
}
Mereka, untuk sebagian besar tujuan, setara. Dan, seperti yang disebutkan sebelumnya, fungsi harus dapat diakses langsung dari sudo -i, jadi itu bonus tambahan.
Saya harap Anda menemukan jawaban dan penjelasan ini bermanfaat!
/root/.bashrctetapi yang benar-benar dicari Q adalah alias dari file ini - ini tidak mungkin untuk ini - unix.stackexchange.com/questions/1496/… .