2014-12-20 20 views
5

~/.bashrc adresimde system komutunu kullanarak Perl'den gelen bir komutu çalıştırmaya çalışıyorum. Komutu sadece bir kez çalıştıran iyi çalışır, ancak iki kez çalıştırdığımda ikinci çağrı bir arka plan işi olarak çalıştırılır ve sonra askıya alınır (<CTRL-Z> tuşlarına basmakla aynıdır) ve komutu tamamlamak için fg yazmam gerekir. Örneğin, ikinci çağrı hiçbir zaman tamamlanmayacaktır. Çıkış, [1]+ Stopped a.pl.Etkileşimli bash kabuğunun altında sistem komutunu çalıştırma

Not: başka bir komutuyla my_cmd değiştirilirken

  • Aynı sonuç, örneğin ls için, elde edilir.
  • ~/.bashrc dosyamın içeriğine bağlı değil gibi görünüyor. Ondan her şeyi kaldırmaya çalıştım ve sorun hala devam etti.

Ubuntu 14.04 ve Perl sürüm 5.18.2 kullanıyorum.

system ('bash -lc "my_cmd"'); 
system ('bash -lc "my_cmd"'); 
:

Güncelleme ayıklama için

Ben benim ~/.bashrc

için
echo "Entering ~/.bashrc .." 
alias my_cmd="ls" 
alias 

ve benim ~/.bash_profile

if [ -f ~/.bashrc ]; then 
    echo "Entering ~/.bash_profile .." 
    . ~/.bashrc 
fi 

Şimdi çalışan azaltılmış

Entering ~/.bash_profile .. 
Entering ~/.bashrc .. 
alias my_cmd='ls' 
bash: my_cmd: command not found 
Entering ~/.bash_profile .. 
Entering ~/.bashrc .. 
alias my_cmd='ls' 
bash: my_cmd: command not found 

ve

system ('bash -ic "my_cmd"'); 
system ('bash -ic "my_cmd"'); 

çalışan veren interaktif kabuk için -i anahtarını kullanarak daha ziyade

Entering ~/.bashrc .. 
alias my_cmd='ls' 
a.pl p.sh 

[1]+ Stopped     a.pl 

cevap

6

verir, sana -l (veya --login) kullanmak gerektiğini düşünüyorum bash, bash'ın bir giriş kabuğu olarak çalıştırılmış gibi davranmasına neden olan anahtar.

-l anahtarını kullanarak, varsayılan olarak ~/.bashrc yüklenmez. man bash'a göre, bir giriş kabuğunda, /etc/profile/ yüklendikten sonra ilk dosya ~/.bash_profile/, ~/.bash_login veya ~/.profile/ bulunur. Benim sistemde, ben ~/.bash_profile aşağıdaki var, bu yüzden ~/.bashrc yüklenir:

# Source .bashrc 
if [ -f ~/.bashrc ]; then 
    . ~/.bashrc 
fi 

Şimdi ~/.bashrc yüklenmekte olduğu yönünde, olmayan bir etkileşimli kabukta kapalı takma genişlemesini, etkinleştirmeniz gerekir.Bunu yapmak için, takma adları ayarlamadan önce aşağıdaki satırı ekleyebilirsiniz:

shopt -s expand_aliases 
+1

Çalışıyor !! Harika :) –

1

rastgele durdurma bir proses - bu STDIN ihtiyacı olmakla birlikte, ekli olmadığında ctrl-z kenara genellikle.

Bunu deneyin - örneğin passwd &. Arka plan olacak ve doğrudan 'durdu' durumuna girecek. Bu, bash komutanla olan şey olabilir. -i, etkileşimli kabuk anlamına gelir ve açıkça onunla etkileşmeyen bir şey yapmaya çalışırsınız.

Bu kesinlikle en iyi yaklaşım değil, muhtemelen farklı bir şey yapmak istersiniz. bash --login, takip ettiklerinize daha yakın olabilir.

0

Tom Fenech'in cevabı Ubuntu 16.04.1 LTS'de küçük bir ekleme ile benim için çalıştı. ~/.bashrc dosyamın üst kısmında, kabuk etkileşimli değilse (ör., Giriş kabuğu), ~/.bashrc hala okunacak şekilde aşağıdaki bölümü açıkladım. Linux'un diğer bazı sürümlerinde bu bölümü görmüyorum.

# If not running interactively, don't do anything 
case $- in 
    *i*) ;; 
     *) return;; 
esac 
İlgili konular