Yanıtlar:
Bu, kabuğun etkileşimli olup olmadığını kontrol eder. Bu durumda, yalnızca ~/.bash_profile
kabuk etkileşimli olduğunda dosyanın kaynağı .
Bkz. "Bu Kabuk Etkileşimli mi?" belirli bir deyimden bahseden bash kılavuzunda. (Ayrıca, $-
özel değişkenin i
karakteri içerip içermediğini test ederek kabuğun etkileşimli olup olmadığını kontrol etmenizi önerir , bu da bu soruna daha iyi bir yaklaşımdır.)
bash
etkileşimli olmayan (önceki yorumunda yazım hatası) bir hata IMO olduğunu unsets PS1, PS1 onu unsetting işi yok, bir bash özgü değişken değildir. Bunu yapan tek kabuk ( etkileşimli olmasa bile varsayılan bir değere yash
ayarlanmış olsa da PS1
).
[[ $- = *i* ]] && source ~/.bash_profile
).
[ -n "${PS1}" ]
, ancak yine de bash kılavuzunun $-
kabuğun etkileşimli olup olmadığını kontrol etmeyi önerdiğini / önerdiğini vurgulamak için güncelledim , umarım cevabı geliştirirsiniz. Şerefe!
Bu, kabuğun etkileşimli olup olmadığını test etmenin yaygın bir yoludur. Sadece bash'da çalıştığını, diğer kabuklarla çalışmadığını unutmayın. Bu yüzden (aptalsa) .bashrc
sorun değil, ama işe yaramaz .profile
(sh tarafından okunur ve bash sh'ın olası uygulamalarından sadece biridir ve en yaygın olanı değildir).
Etkileşimli kabuk, kabuk değişkeniniPS1
varsayılan bilgi istemi dizesine ayarlar . Kabuk etkileşimli ise PS1
, ayarlanır (kullanıcı .bashrc
onu kaldırmamışsa, bu henüz üstünde .bashrc
olamaz ve yine de bunun aptalca bir şey olduğunu düşünebilirsiniz).
Tersi bash için geçerlidir: interaktif olmayan bash unset örnekleri PS1
başladığında. Bu davranışın bash'a özgü olduğunu ve muhtemelen bir hata olduğunu unutmayın (neden olduğu bash -c '… do stuff with $var…'
zaman işe yaramaz ?). Ancak 4.4'e (yazdığım en son sürüm) kadar olan tüm bash sürümleri bunu yapar.var
PS1
Birçok sistem PS1
çevreye ihracat yapar. Birçok farklı kabuklar kullanmak, çünkü kötü bir fikir PS1
ama farklı bir sözdizimi ile (örneğin bash en istemi kaçar tamamen farklıdır zsh en istemi kaçar ). Ancak pratikte, bunun PS1
ayarlandığını görmek kabuğun etkileşimli olduğuna dair güvenilir bir gösterge olmadığı kadar yaygındır . Kabuk PS1
çevreden miras almış olabilir .
.bashrc
bash etkileşimli olduğunda başlangıçta okuyan dosyadır. Daha az bilinen bir gerçektir bash da okur olmasıdır .bashrc
bir giriş kabuğu ve bash en buluşsal (üst ise bash kontrolleri bu uzak bir oturumda olduğu sonucuna rshd
ya sshd
). Bu ikinci durumda, PS1
henüz nokta dosyası çalışmadığından, ortam içinde ayarlanması pek olası değildir .
Ancak, kodun bu bilgileri kullanma şekli verimsizdir.
.bash_profile
bu kabukta çalışır . Ancak .bash_profile
bir oturum açma zamanı betiğidir. Oturum başına yalnızca bir kez çalıştırılması amaçlanan bazı programları çalıştırabilir. Kullanıcının bu kabuğu çalıştırmadan önce kasıtlı olarak farklı bir değere ayarlamış olduğu bazı ortam değişkenlerini geçersiz kılabilir. .bash_profile
Giriş yapmayan bir kabukta çalıştırmak yıkıcıdır..bash_profile
. Ancak bu, yüklemenin .bash_profile
yararlı olabileceği bir durumdur , çünkü etkileşimli olmayan bir giriş kabuğu otomatik olarak yüklenmez /etc/profile
ve ~/.profile
.İnsanların bunu yapmasının nedeni, GUI (çok yaygın bir durum) aracılığıyla giriş yapan ve ortam değişken ayarlarını .bash_profile
yerine yerleştiren kullanıcılar içindir .profile
. Çoğu GUI oturum açma mekanizması çağrılır, .profile
ancak çağrılmaz .bash_profile
(okuma .bash_profile
, oturum başlatma işleminin bir parçası olarak sh yerine çalıştırmayı gerektirir). Bu yapılandırmada, kullanıcı bir terminal açtığında, ortam değişkenlerini alırlar. Bununla birlikte, kullanıcı, çok yaygın bir karışıklık kaynağı olan GUI uygulamalarında ortam değişkenlerini alamayacaktır. Buradaki çözüm, ortam değişkenlerini ayarlamak .profile
yerine kullanmaktır .bash_profile
. Arasına bir köprü eklemek .bashrc
ve .bash_profile
çözdüğünden daha fazla sorun yaratır.
Geçerli kabuğun etkileşimli olup olmadığını test etmenin basit ve taşınabilir bir yolu vardır: seçeneğin -i
etkin olup olmadığını test edin .
case $- in
*i*) echo "This shell is interactive";;
*) echo "This shell is not interactive";;
esac
Bu, yalnızca kabuk etkileşimli değilse, yani kodun tersi .bashrc
olduğunda okumak .profile
için yararlıdır ! Oku .profile
bash bir (etkileşimli olmayan) giriş kabuğu ve etkileşimli bir kabuk varsa okumak yoksa.
if [[ $- != *i* && -r ~/.profile ]]; then . ~/.profile; fi
[[ -o interactive ]]
(ksh, bash, zsh) veya case $- in (*i*) ...; esac
(POSIX) olduğunu
PS1
etkileşimli olarak çalıştırılmazsa aslında ayarlanmamış görünüyor . Test etmek yeterince kolaydır: bash başlangıç dosyalarınızda set değerini yazdırırken ( PS1=cuckoo bash -c '[ -n "${PS1}" ] && echo "PS1=[${PS1}]"'
hiçbir şey "guguk kuşu" yazmaz). PS1=cuckoo bash -i -c '[ -n "${PS1}" ] && echo "PS1=[${PS1}]"'
$PS1
$-
içeren i
interaktif bir kabuk ile.
[ -n "${PS1}" ]
yanlış çağırmanın biraz ileri gittiğini söyleyebilirim , sonuçta sadece bir kişi PS1'i dışa aktardığında (bu cevabınızda kötü bir fikir olduğunu ve hatta nedenlerine girdiğinizde) kırıldığını söyler ve bu etkilemez bash neyse (eğer kabuk etkileşimli değilse PS1 ve PS2'yi kaldırdığı için.) Belki "cesareti kırılmış" gibi bir kelimeyi kullanmak ya da yaklaşımın "sınırlamaları" hakkında konuşmak daha iyi olurdu. Bunun tamamen "yanlış" olduğunu düşünmüyorum. Şey ise yanlış kesin PS1, ihraç! Her neyse, bunun ayrıntılarına girdiğiniz için teşekkürler.
Bu garip kavram, bash
bir POSIX kabuk klonu olarak değil, bir Bourne Shell
klon olarak başlamasından kaynaklanıyor gibi görünüyor .
Sonuç olarak, POSIX etkileşimli davranışı ( $ENV
etkileşimli kabuklar için çağrılır) daha sonra eklenmiştir bash
ve yaygın olarak bilinmemektedir.
Benzer davranış veren bir kabuk var. Bu csh
ve $prompt
belirli değerlere sahip csh hibeleri :
$prompt not set non-interactive shell, test $?prompt.
$prompt set but == "" .cshrc called by the which(1) command.
$prompt set and != "" normal interactive shell.
Ancak bu ne Bourne Kabuğu veya POSIX mermileri için geçerli değildir.
POSIX kabuğu için, verilen tek yöntem, dosyaya etkileşimli kabuklar için kod koymaktır:
$ENV
Kabuğa özel bir adı vardır. Örneğin
$HOME/.kshrc for the korn shell
$HOME/.bashrc for bash
$HOME/.mkshrc for mksh
$HOME/.shrc for the POSIX Bourne Shell
Diğer insanlar kabuk bayrağından bahsetti -i
, ancak bu güvenilir programlama için kullanılamaz. POSIX ne set -i
çalışır ne de interaktif mermiler için $-
bir içerir i
. POSIX sadece sh -i
kabuğun etkileşimli moda zorlanmasını gerektirir .
Değişken $PS1
ortamdan alınabileceğinden, etkileşimli olmayan modda bile bir değere sahip olabilir. Aslında bash
unset
ler PS1
olmayan herhangi etkileşimli kabukta standardında verilmeyen ve diğer kabuk tarafından yapılmaz.
Yani temiz programlama (ile bile bash
) interaktif mermiler için komutları koymaktır $HOME/.bashrc
.
İlk olarak Debian'ın nelerden konuşacağım ve çoğu zaman Ubuntu'nun bash için ayarladığı şey. Ve diğer sistemlere ikinci dokunuş.
Kabuk başlangıç dosyalarının ayarlanmasında çok fazla fikir vardır.
Benim de fikrim var ama doğru ayarların mevcut örneklerini göstermeye çalışacağım.
Dosyalarından örnekler bulmak oldukça kolay olduğundan debuan kullanacağım.
Ve debian yoğun bir şekilde kullanılıyor, bu yüzden ayarlar iyi test edildi,
Sadece kabuğun etkileşimli olup olmadığını öğrenmek için.
Varsayılan /etc/profile
debian ve ubuntu (gelen / usr / share / baz files / profil):
if [ "${PS1-}" ]; then
if [ "${BASH-}" ] && [ "$BASH" != "/bin/sh" ]; then
İf okundu: etkileşimli ise (varsayılan PS1 seti) ve bir bash kabuğudur (ancak varsayılan olarak davranmaz sh
), sonra PS1'i belirli bir yenisiyle değiştirin (varsayılan değil).
Varsayılan /etc/bash.bashrc
debian içinde de içerir:
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
Bu, yaptığı işte oldukça açıktır: Etkileşimli ise kaynak yapmayın (geri kalanı).
Bununla birlikte, içinde /etc/skel/.bashrc
bir örnektir (kullanarak etkileşimli kabuk test etmek için, doğru bir şekilde $-
):
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
Bu PS1 ve bir alternatifin nedenini açıkça göstermelidir.
Bildirdiğiniz ayarlardan kaçınılmalıdır.
(Sistem ayarlarından () partisi yüzünden daha spesifik kullanıcı ayarlarına) sipariş /etc/profile
, /etc/bash.bashrc
, ~/.profile
ve nihayet ~/.bashrc
. Bu, en geniş etkileri (ve daha fazla kabuk için) /etc/profile
(köke ait) ve ardından /etc/bash.bashrc
(aynı zamanda köke de aittir) yerleştirir, ancak sadece bash'ı etkiler. Sonra kişisel ayarları girin $HOME
, ilki ~/.profile
çoğu kabuk için ve ~/.bashrc
(neredeyse eşdeğer ~/.bash_profile
), sadece bas için spesifiktir.
Bu nedenle kaynak ~/.bashrc
yapmak yanlıştır ~/.profile
, bash için belirli bir kullanıcı ayarını, daha fazla mermiyi etkileyen daha genel bir hale dönüştürüyor . Bu şekilde yapılması haricinde :
# ~/.profile: executed by the command interpreter for login shells
# if running bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
Bash'ın çalışıp çalışmadığını kontrol eder ve yalnızca .bashrc
bu durumda yükler .
Bu Debian'dan gelen yukarı yönlü bir karardır. Gerekçe burada açıklanmaktadır .
Aslında, tersten, kaynak olarak ~/.profile
içinde ~/.bash_profile
(veya ~/.bashrc
) sadece-re uygulayarak bu nedenle belirli bir kullanım alanına zaten yüklenmiş ve edilmişti gereken genel kurallar "değil kötü" (Ben "iyi" demiyorum) olduğu. Ve ben iyi demiyorum çünkü dosyaların kaynak döngüsüne neden olabilir. Bir alt dizin bir üst öğe yüklediğinde olduğu gibi, bu bir dizin döngüsüdür.
Ve bu çapraz kaynakta etkileşimli kabuk kontrolü mantıklı. Yalnızca bir kabuk etkileşimli olduğunda ~/.bashrc
yüklenir, ancak sırayla yüklenebilir ~/.profile
(veya başka bir şekilde) ve bu durumda etkileşimli bir kabuk olup olmadığı kontrol edilebilir.
( export PS1='abc$ '; bash -c 'echo "[$PS1]"' )
sadece basan ile görebilirsiniz[]
. Herhangi bir durumda ... en azından bir deneyden aynı yapmaz zsh, görünüyor niyeti ait[ -n "$PS1" ]
kabuk etkileşimli olup olmadığını kontrol etmektir.