TL; DR: Tanımlı sudo -i
bir işlevi çalıştırmak için /root/.bashrc
(ancak diğer ad değil) kullanabilir ve ayrıca bu dosyadan dışa aktarılan değişkenlere erişebilirsiniz:
sudo -i komut bağımsız değişkenleri
Ancak takma adlar orada çalışmaz, ancak bunları kullanılabilir hale getirmek istiyorsanız bunları işlevlere kolayca dönüştürebilirsiniz sudo -i
.
Tüm analiz ve daha fazla ayrıntı için okumaya devam edin.
Burada, bazıları sudo'nun nasıl çalıştığı, bazıları da bash'ın nasıl çalıştığı konusunda birkaç sorun var ...
Varsayılan olarak, sudo
yalnızca komutları arar ve kabuğu atlar, bu nedenle sadece içindeki dizinlerden birinde çalıştırılabilir sudo ll
bir ll
dosya çalıştırıldığında çalışır $PATH
. Bu nedenle, takma adları (veya işlevleri) kullanmak için, bir kabuğun işlemin bir parçası olarak çağrıldığından emin olmanız gerekir.
Tek yönlü gibi bir şey çalıştırmak olacaktır sudo sh
veya sudo bash
çağdaş rağmen sudo
(ben sudo 1.8.19p1 bu test ediyorum) seçenekleri vardır -s
ve -i
bu amaçla.
Yani bir deneyin gibi bir şey olurdu sudo -s ll
(eşdeğerdir sudo bash -c 'll'
, senin varsayarak $SHELL
dayanarak böyle görünüyor Bash vardır rcfile
, olmayan bir interaktif içinde kabuğunu başlatır beri, ya da çalışmaz Ama söz etti.) başlangıç dosyalarının hiçbirini okumayan oturum açma modu. Bu aslında bir kabuk betiği yazıp #!/bin/bash
çalıştırmak için kullandığınız gibidir. İçinde bulunduğunuz diğer adlara (ve işlevlere) ~/.bashrc
bu komut dosyasından erişilemez ...
Sırada -i
bir oturum açma kabuğu oluşturan seçenek var. O zamandan beri Yani, daha umut verici olduğunu edecektir başlangıç dosyalarını okumak! Ve yine de, sudo -i ll
(buna eşdeğer sudo bash -l -c 'll'
) hala çalışmaz. Yani nasıl olabilir, verilen bu did tanımını okumak ll
takma?
Buradaki bir sonraki açıklama, varsayılan olarak, bash'ın kabuk etkileşimli olması dışında takma adları genişletmeyeceği ... sudo -i
(veya bash -l
) tarafından başlatılan bu kabuk bir giriş kabuğu, ancak yine de etkileşimli değil.
Bir sonraki adım , daha sonra çalışan etkileşimli bir kabuk elde etmektir :
sudo bash -i -c 'll'
(Hem Having giriş ve interaktif da ince, tabii ki bash -l -i -c ...
çalışacaktır.)
Başka bir alternatif, bir giriş kabuğu (etkileşimli olmayan) kullanmaya devam etmektir, ancak açıkça takma adları genişletmesini istemektir, böylece bu da işe yarayacaktır:
sudo bash -l -O expand_aliases -c 'll'
(Bash oldu vaka interaktif bir gerek yoktu giriş o başlatma dosyalarını okumak için yeterli olduğundan, kabuk, ama bu bir ihtiyaç -l
onları okumak için.)
Bunlar oldukça uzun komut satırları ... Ve ayrıca tüm kabuk komutunu alıntılamanızı gerektirir, bu yüzden argümanlarla bir takma ad çağırırsanız, bunları bir dizeye dönüştürmeniz gerekir ... kullanmak için sakar ...
Daha önce takma adlar ve işlevler hakkında konuştuğumu unutmayın ... Amaçlar buradaydı, çünkü işlevler aslında burada çok daha uygun. Tanımlarını kaynakladığınız sürece, bir kabuk üzerinde işlevleri yürütmek için özel bir şeye (etkileşimli bir kabuğa sahip olmak veya belirli bir seçeneği ayarlamak gibi) ihtiyacınız yoktur.
Dolayısıyla , takma ad yerine ll
bir işlev olarak tanımladıysanız , bunu doğrudan sudo -i
kısayoluyla kullanabilirsiniz:
sudo -i ll
Ve daha uzun bir komut satırınız varsa, bağımsız değişkenlerle bunları doğrudan buraya da iletebilirsiniz:
sudo -i ll -C -R /etc
(İle karşılaştır sudo bash -i -c 'll -C -R /etc'
.)
İşlevler de çok daha esnek ve bakımı daha kolaydır ... Bir takma adı bir işleve dönüştürmek genellikle kolaydır, tek uyarı her zaman "$@"
ekstra argümanların alınmasını beklediğiniz yerlerde kullanmaktır (genellikle ad.)
Örneğin, bu takma ad:
alias ll='ls $LS_OPTIONS -l'
Bu işleve dönüştürülebilir:
ll () {
ls $LS_OPTIONS -l "$@"
}
Çoğu amaç için eşdeğerdirler. Ve daha önce de belirtildiği gibi, işleve doğrudan erişilebilir olmalıdır sudo -i
, bu yüzden bu bir avantajdır.
Umarım bu yanıtı ve açıklamayı yararlı bulursunuz!
/root/.bashrc
ancak gerçekten Q'nun peşinde olan bu dosyadaki takma adlar - bu mümkün değil - unix.stackexchange.com/questions/1496/… .