2011-12-08 26 views
11

Tôi thường xuyên thực hiện từ một lệnh shell (trong trường hợp Bash) mà tôi muốn rẽ nhánh ngay lập tức và đầu ra mà tôi muốn bỏ qua. Do đó, trên thực tế, tôi đã tạo một tập lệnh (silent) để thực hiện:Đơn giản chỉ cần forking và chuyển hướng đầu ra của một lệnh đến/dev/null

#!/bin/bash 
[email protected] &> /dev/null & 

Sau đó tôi có thể chạy, ví dụ:

silent inkscape myfile.svg 

và thiết bị đầu cuối của tôi sẽ không bị ô nhiễm bởi đầu ra gỡ lỗi của quá trình tôi vừa mới chia.

Tôi có hai câu hỏi:

  1. Có một cách "chính thức" để làm điều này ?, ví dụ: một cái gì đó ngắn hơn nhưng tương đương với &> /dev/null &?

  2. Nếu không, có cách nào tôi có thể thực hiện công việc hoàn thành tab sau lệnh silent của mình như thể nó không có ở đó không? Để đưa ra một ví dụ, sau khi tôi đã nhập silent inksc, tôi muốn bash tự động hoàn tất lệnh của tôi thành silent inkscape khi tôi nhấn [tab].

+0

Bạn đã viết 'như thể nó không có ở đó'. Xin lỗi 'nó' là gì? Có thể bạn có thể chỉnh sửa bài đăng của mình để làm rõ. Chúc may mắn. – shellter

+0

Điều này có nghĩa là làm cho bash đối xử với các đối số thành 'im lặng' như một lệnh bình thường, với việc hoàn thành tab bình thường có sẵn cho lệnh đó. Vì vậy, 'im lặng git pus [TAB]' sẽ hoàn thành 'im lặng git push'. –

+1

Tôi đã làm rõ câu hỏi thứ hai, cảm ơn vì đã hỏi. Ví dụ git có lẽ thậm chí còn tốt hơn, vì nó cho thấy rằng tôi muốn bash sử dụng hồ sơ hoàn thành git trong trường hợp đó. – Philippe

Trả lời

4

sang một bên: có thể muốn exec "[email protected]" &> /dev/null & trong tập lệnh silent của bạn, để làm cho nó loại bỏ vỏ phụ và dấu ngoặc kép xung quanh "[email protected]" sẽ giữ khoảng trống không bị cản trở.

Đối với # 2: complete -F _command silent nên làm điều gì đó giống như những gì bạn muốn. (Tôi gọi phiên bản của tập lệnh đó là launch và có complete -F launch trong số .bash_profile)

0

Có lẽ nếu bạn có thể 'rebind' phím tab? An example trên superuser Stackoverflow với phím enter được hiển thị. Đây có phải là ý tưởng đúng không?

1

Đây là một tập lệnh nhỏ tôi sử dụng để khởi chạy ứng dụng X tương tác (và trò chuyện) từ ví dụ: một xterm

#!/bin/bash 
exe="$1" 
shift 
"$exe" "[email protected]" 2>/tmp/$$."$exe".err 1>&2 & disown $! 

Không đầu ra, sẽ không chết nếu các lối ra thiết bị đầu cuối, nhưng trong trường hợp họ gặp khó khăn có một bản ghi của tất cả các đầu ra trong/tmp

Nếu bạn không muốn đăng nhập chỉ cần sử dụng/dev/null để thay thế.

Cũng sẽ hoạt động từ một hàm nếu bạn là chữ viết tắt.

2

Dường như nohup hoạt động nhiều hơn hoặc ít hơn những gì bạn muốn. Vấn đề hoàn thành tab là vì bash nghĩ rằng bạn đang cố gắng hoàn thành một tên tệp làm đối số cho tập lệnh, trong khi các quy tắc hoàn thành của nó biết rằng nohup nhận lệnh làm đối số đầu tiên của nó.

Nohup chuyển hướng stout và stderr thành nohup.out và cũng sẽ để lại lệnh chạy nếu trình bao của bạn thoát.

+0

Tôi đoán 'nohup' gần như là những gì tôi muốn; nó không tự động ngắt quá trình, theo như tôi hiểu hoạt động của nó. – Philippe

+0

Không, nhưng bạn có thể sử dụng "nohup lệnh &" nếu bạn cần chạy quá trình trong nền. – nelz

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