2014-12-20 14 views
5

Tôi đang cố chạy lệnh đã được đặt bí danh trong số ~/.bashrc của mình từ Perl bằng lệnh system. Nó hoạt động tốt chạy lệnh chỉ một lần, nhưng khi tôi chạy nó hai lần lời gọi thứ hai được chạy như một công việc nền và sau đó bị đình chỉ (giống như cách nhấn <CTRL-Z>) và tôi phải nhập fg để hoàn thành lệnh. Ví dụ:Chạy lệnh hệ thống dưới vỏ bash tương tác

use strict; 
use warnings; 

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

Cuộc gọi thứ hai không bao giờ hoàn thành. Đầu ra là [1]+ Stopped a.pl.

Lưu ý:

  • Kết quả tương tự cũng thu được khi thay thế my_cmd với bất kỳ lệnh khác, ví dụ ls.
  • Dường như không phụ thuộc vào nội dung của tệp ~/.bashrc của tôi. Tôi đã cố gắng để loại bỏ tất cả mọi thứ từ nó, và vấn đề vẫn còn tồn tại.

Tôi đang sử dụng Ubuntu 14.04 và Perl phiên bản 5.18.2.

Cập nhật

Để gỡ lỗi tôi giảm của tôi ~/.bashrc để

echo "Entering ~/.bashrc .." 
alias my_cmd="ls" 
alias 

và tôi ~/.bash_profile để

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

Bây giờ chạy:

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

cho

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 

và chạy

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

cho

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

[1]+ Stopped     a.pl 

Trả lời

6

Thay vì sử dụng các -i chuyển đổi cho một vỏ tương tác, tôi nghĩ rằng bạn nên sử dụng -l (hoặc --login) chuyển đổi, làm cho bash hoạt động như thể nó đã được gọi là một vỏ đăng nhập.

Sử dụng công tắc -l không tải ~/.bashrc theo mặc định. Theo man bash, trong vỏ đăng nhập, /etc/profile/ được tải, tiếp theo là tệp đầu tiên được tìm thấy từ ~/.bash_profile/, ~/.bash_login hoặc ~/.profile/. Trên hệ thống của tôi, tôi có sau trong ~/.bash_profile, vì vậy ~/.bashrc được nạp:

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

Bây giờ ~/.bashrc của bạn đang được nạp, bạn cần phải kích hoạt việc mở rộng các bí danh, đó là tắt trong một vỏ không tương tác.Để làm điều này, bạn có thể thêm dòng sau đây trước khi thiết lập bí danh của bạn:

shopt -s expand_aliases 
+1

Nó đang hoạt động !! Tuyệt quá :) –

1

Một quy trình dừng lại một cách ngẫu nhiên - ngoài ctrl-z thường là khi nó cần STDIN, nhưng không có nó kèm theo.

Hãy dùng thử - ví dụ: passwd &. Nó sẽ nền và đi thẳng vào trạng thái 'dừng lại'. Điều này cũng có thể là những gì đang xảy ra với lệnh bash của bạn. -i có nghĩa là trình bao tương tác, rõ ràng và bạn đang cố gắng làm điều gì đó không tương tác với nó.

Đó gần như chắc chắn không phải là cách tiếp cận tốt nhất, bạn có thể muốn làm điều gì đó khác biệt. bash --login có thể gần hơn với những gì bạn đang theo dõi.

0

Câu trả lời của Tom Fenech đã hoạt động với tôi trong Ubuntu 16.04.1 LTS với một bổ sung nhỏ. Ở đầu tệp ~/.bashrc của tôi, tôi đã nhận xét phần sau để nếu shell không tương tác (ví dụ: shell đăng nhập), ~/.bashrc vẫn được đọc. Trên một số phiên bản Linux khác, tôi không thấy phần này.

# If not running interactively, don't do anything 
case $- in 
    *i*) ;; 
     *) return;; 
esac 
Các vấn đề liên quan