Etkileşimli olmayan kabuk genişletme takma adı


12

Gibi bir komut çalıştırdığınızda, takma hesabımı genişletmek için takma ad alma konusunda sorun yaşıyorum:

ssh user@server "bash -c \"alias\""

Benim .bashrc dosyam:

echo .bashrc
# .bashrc

shopt -s expand_aliases

# Source global definitions (commenting this out does nothing)
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# User specific aliases and functions
alias php="php55"
alias composer="php ~/bin/composer.phar"

Yukarıdaki ssh komutunu çalıştırdığımda ".bashrc" yankılandığını görüyorum. Ama takma ad çalıştırmaya çalışırsam hiçbir şey elde edemem.

Ben "bash -ic" deneyebilirsiniz, ama bu aslında kolayca değiştiremiyorum bir komut dosyası ve bunun neden çalışmadığını bilmek istiyorum.

Çıktı ssh user@server "bash -c \"shopt\""

.bashrc
autocd          off
cdable_vars     off
cdspell         off
checkhash       off
checkjobs       off
checkwinsize    off
cmdhist         on
compat31        off
compat32        off
compat40        off
dirspell        off
dotglob         off
execfail        off
expand_aliases  off
extdebug        off
extglob         off
extquote        on
failglob        off
force_fignore   on
globstar        off
gnu_errfmt      off
histappend      off
histreedit      off
histverify      off
hostcomplete    on
huponexit       off
interactive_comments    on
lithist         off
login_shell     off
mailwarn        off
no_empty_cmd_completion off
nocaseglob      off
nocasematch     off
nullglob        off
progcomp        on
promptvars      on
restricted_shell        off
shift_verbose   off
sourcepath      on
xpg_echo        off

Çıktı ssh user@server "bash -c \"echo $SHELL\""

.bashrc
/bin/bash

Vazgeçtim ve sadece takma adlarla istediğim şeyi yapan ~ / bin'de semboller ve komut dosyaları oluşturdum. Sürece anlatmaya diğer ihracat olarak $PATHolarak ~/bin:$PATHiyi çalışıyor.
Matt

Ubuntu'da (16.04 ve daha yenisi) işlendiğinde bir ~/.local/binzamanınız /etc/profilevarsa bunu otomatik olarak PATH'ınıza ekleyecektir. . /etc/profileKlasörü oluşturduktan hemen sonra, yeniden başlatma veya oturum kapatma / oturum açma olmadan PATH'nize eklenmesini sağlayabilirsiniz.
dragon788

Yanıtlar:


15

Gönderen bash(1)adam sayfası:

Expand_aliases shell seçeneği shopt kullanılarak ayarlanmadığı sürece takma adlar kabuk etkileşimli olmadığında genişletilmez (aşağıdaki SHELL BUILTIN COMMANDS altındaki shopt açıklamasına bakın).


5
Ben var shopt -s expand_aliasesbenim .bashrc içinde, ama bu işin görünmüyor. Neden olmasın emin değilim, ama sanırım bu normal cevap olacaktır
Matt

@Matt Emin 'etkinlik' emri değilim, ama emin yapmayı deneyin vermedi shopt -s expand_aliasesolduğunu da .bashrctakma adları önce? Kuşkusuz, soru gösterir çıktı expand_aliasesolduğu off.
kıpkırmızı-ak balıkçıl

Evet, sorumdaki .bashrc'ye bakın. Yankı çizgisini görüyorum ama shoptkapalı olarak gösteriyor. Belki bunu engelleyen garip bir sunucu ayarı var, bilmiyorum. Bir çözüm buldum
Matt

muhtemelen .bashrcdosya varsayılan olarak kaynaklanmıyordu.
Daniel Farrell

8

SSH ile uzaktan bir komut yürüttüğünüzde aldığınız kabuk ne etkileşimli bir kabuk ne de bir giriş kabuğu değildir:

$ ssh server 'bash -c "echo $-"'
chsB

( yanıtta hayır ive hayır var l)

Bash'ın durumunda bu, normal başlatma dosyalarının hiçbirinin okunmadığı anlamına gelir.

Sen ekleyerek bir giriş kabuğu olarak uzak kabuk zorlayabilir -lbunun ilkini ayrıştırmak edeceğini hangi araçlar, Bash çağırma ~/.bash_profile, ~/.bash_loginve ~/.profilebu bulabilmesi bu sırayla arama değil ~/.bashrc. Bu, takma adlarınızı bu dosyalardan birine koymanız gerektiği anlamına gelir.


Bu çözüm gibi geliyor. Bu sunucuyu artık kullanamıyorum, bu yüzden test edemiyorum, ancak başka birisinin soruyu bulması durumunda muhtemelen bu videoyu yükseltmeye değer.
Matt

2

Aynı sorunu yaşadım ve ilk başta shopt -s expand_aliasesyardımcı olmadı. Bulduğum şey, gerçek takma adları eklemeden önce bu seçeneklerin ayarlanması gerektiğidir. Takma adları önce oluşturulan Yani eğer .bashrcsetleri expand_aliasesseçenekleri, bunlar kullanılabilir olmayacaktır. Bu nedenle, seçeneği ayarladıktan sonra takma adları yüklemeniz (veya yeniden yüklemeniz) gerekir.


0

bash (1) diyor

...

Oturum açma kabuğu olmayan bir etkileşimli kabuk başlatıldığında, bash bu dosya varsa ~ / .bashrc'den komutları okur ve yürütür.

...

Etkileşimli kabuk, isteğe bağlı olmayan bağımsız değişkenler olmadan ve standart girdi ve hatası hem terminallere (isatty (3) tarafından belirlenen) bağlı olan -c seçeneği olmadan başlatılır ya da -i seçeneğiyle başlatılır.

yani, açıkçası, .bashrc'yi manuel olarak kaynak yaparsınız veya -i ile çalıştırırsınız

takma adlar tek ihtiyacınız varsa, bunları örneğin .aliases olarak ayırmanızı ve daha sonra hem .bashrc hem de komut dosyanızdan kaynaklamanızı öneririm.


Bu yüzden görüyorum ki .bashrc kaynaklanıyor. Komutu çalıştırdığımda .bashrc yankı satırını görüyorum. Sorun, bu dosyadaki diğer adların genişlememesidir.
Matt

0

Girerek herhangi bir sorunu çözebilirsiniz:

if [ -f /etc/skel/.bashrc ]; then . /etc/skel/.bashrc; fi

ilk satırda.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.