2012-04-01 43 views
9

Giả sử tôi có một kịch bản: my_script.shChạy một kịch bản đường ống từ stdin (Linux/Shell Scripting)

Thay vì làm

./my_script.sh 

tôi muốn làm một cái gì đó như:

cat my_script.sh | <some command here> 

sao cho tập lệnh thực thi. Điều này có thể không?

Trường hợp sử dụng là nếu tập lệnh tôi muốn thực thi là đầu ra của một wget hoặc s3cat, v.v. Ngay bây giờ tôi lưu nó vào một tệp tạm thời, thay đổi nó thành tệp thực thi và sau đó chạy nó. Có cách nào để làm điều đó trực tiếp không?

+1

Bạn phải rất cẩn thận làm điều này. Nếu bất kỳ thứ gì bên trong kịch bản lệnh của bạn đọc từ stdin (ví dụ, bất kỳ lệnh nào nhắc người dùng "Có/Không"), nó sẽ tiêu thụ các dòng * từ tập lệnh của bạn * và các dòng đó sẽ không được thực hiện. –

Trả lời

15

Chỉ cần ống nó vào vỏ ưa thích của bạn, ví dụ:

$ cat my_script.sh 
set -x 
echo hello 
$ cat my_script.sh | sh 
+ echo hello 
hello 

(Các set -x làm cho vỏ in ra từng tuyên bố đó là về để chạy trước khi nó chạy nó, tiện dụng để gỡ lỗi, nhưng nó không có gì . để làm với vấn đề của bạn đặc biệt - chỉ có mục đích demo)

+0

vì câu trả lời này dành cho ai đó không quen thuộc với bash, câu trả lời của bạn sẽ tốt hơn nếu bạn giải thích phần 'set -x' của lệnh hoàn thành và cho dù đó là một phần của giải pháp hay chỉ là một ví dụ về các loại bạn có thể làm. –

+0

Làm rõ. (Không có gì bash cụ thể trong đó, 'set -x' sẽ có sẵn trong tất cả các shell POSIX.) – Mat

+1

nếu kịch bản chỉ định kiểu shell với" #! " công cụ, sau đó không ghi đè lên bất cứ điều gì vỏ tôi ống nó vào? – Switch

3

bạn có thể sử dụng:

cat my_script.sh | xargs -i <some_command> {} 

hay:

cat my_script.sh | bash - 
1

RVM khuyến cáo phương pháp này để run their installer:

bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer) 
Các vấn đề liên quan