2011-02-12 35 views
5

Tôi có lệnh sau trong .bashrc của tôi:bí danh Gọi bash trong cào

alias mfigpdf='for FIG in *.fig; do fig2dev -L pdftex "$FIG" "${FIG%.*}.pdftex"; done; 
       for FIG in *.fig; do fig2dev -L pstex_t -p "${FIG%.*}.pdftex" "$FIG" "${FIG%.*}.pdftex_t"; done' 

Và tôi muốn thực hiện lệnh 'mfigpdf' trong Rakefile tôi:

desc "convert all images to pdftex (or png)" 
task :pdf do 
    sh "mfigpdf" 
    system "mfigpdf" 
end 

Nhưng không ai trong số đề tài nhiệm vụ đang hoạt động. Tôi có thể chỉ cần sao chép lệnh trong rakefile chèn nó trong một tập tin shellscript, nhưng hơn tôi có mã trùng lặp.

Cảm ơn sự giúp đỡ của bạn!

Matthias

+1

Tại sao không khai báo bí danh này dưới dạng hàm trong tệp rake? Bạn sẽ có toàn bộ sức mạnh của ruby ​​theo ý của bạn.Xin lỗi, tôi làm tất cả mọi thứ trong ruby ​​và tôi thấy bạn đang sử dụng rake đó là lý do tại sao không thể không hỏi bạn. –

Trả lời

1

Bạn phải nguồn .bashrc của bạn để tải rằng bí danh, nhưng tôi nghĩ rằng ruby ​​chạy trên sh mà doesnt sử dụng lệnh nguồn nhưng '' command.I tin này nên làm việc:

`. /path/to/.bashrc '

+0

Vẫn không hoạt động, Fernando nhưng cảm ơn sự giúp đỡ của bạn. –

3

sh mfigpdf sẽ cố gắng để chạy một kịch bản shell với tên đó, bạn phải sử dụng sh -c mfigpdf để thay thế.

Bạn cũng phải buộc bash vào chế độ "trình tương tác" với cờ -i để bật mở rộng bí danh và tải ~/.bashrc.

sh "bash -ci 'mfigpdf'" 

Bạn có thể thay thế bí danh bằng hàm bash. Chức năng cũng được mở rộng trong chế độ không tương tác, vì vậy bạn có thể chỉ nguồn ~/.bashrc thay vì:

sh "bash -c '. ~/.bashrc ; mfigpdf'" 
4

Có ba vấn đề ở đây:

  • Bạn cần phải source ~/.profile, hoặc bất cứ nơi nào bí danh của bạn được lưu trữ, trong subshell.
  • Bạn cần gọi số shopt -s expand_aliases để bật bí danh trong trình bao không tương tác.
  • Bạn cần phải thực hiện cả hai điều này trên dòng riêng biệt từ cuộc gọi thực tế tới bí danh. (Đối với một số lý do, thiết lập expand_aliases không làm việc cho bí danh trên cùng một dòng đầu vào, ngay cả khi bạn sử dụng dấu chấm phẩy Xem this answer..)

Vì vậy:

system %{ 
    source ~/.profile 
    shopt -s expand_aliases 
    mfigpdf 
} 

nên làm việc.

Tuy nhiên, tôi khuyên bạn nên sử dụng hàm bash thay vì bí danh. Vì vậy, bash bạn sẽ là:

function mfigpdf() { 
    for FIG in *.fig; do 
    fig2dev -L pdftex "$FIG" "${FIG%.*}.pdftex" 
    done 
    for FIG in *.fig; do 
    fig2dev -L pstex_t -p "${FIG%.*}.pdftex" "$FIG" "${FIG%.*}.pdftex_t" 
    done 
} 

Và ruby ​​của bạn:

system 'source ~/.profile; mfigpdf' 

Các chức năng sẽ cư xử cơ bản theo cùng một cách như là bí danh trong một vỏ tương tác, và sẽ dễ dàng hơn để gọi trong một phi vỏ tương tác.

+0

Đây là một câu trả lời tuyệt vời, nhưng những gì vẫn còn thiếu là việc duy trì phạm vi vỏ. Mỗi cmd shell sử dụng một bí danh phải xảy ra trên một dòng, và không có ruby ​​khác ở giữa. –

Các vấn đề liên quan