2012-10-25 39 views

Trả lời

515

Nếu bạn muốn thực hiện mỗi lệnh chỉ khi trước đó đã thành công, sau đó kết hợp chúng bằng cách sử dụng && điều hành:

cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install 

Nếu một trong các lệnh thất bại, sau đó tất cả các lệnh khác sau nó sẽ không được Thực thi.

Nếu bạn muốn thực hiện tất cả các lệnh bất kể những người trước đây đã thất bại hay không, tách chúng bằng dấu chấm phẩy:

cd /my_folder; rm *.jar; svn co path to repo; mvn compile package install 

Trong trường hợp của bạn, tôi nghĩ rằng bạn muốn trường hợp đầu tiên nơi thực hiện các lệnh tiếp theo phụ thuộc vào sự thành công của trước đó.

Bạn cũng có thể đặt tất cả các lệnh trong một kịch bản và thực hiện mà thay vào đó:

#! /bin/sh 
cd /my_folder \ 
&& rm *.jar \ 
&& svn co path to repo \ 
&& mvn compile package install 

(Dấu gạch chéo ngược ở phần cuối của dòng đang có để ngăn chặn vỏ từ suy nghĩ rằng dòng tiếp theo là một lệnh mới ; nếu bạn bỏ qua các gạch chéo ngược, bạn sẽ cần phải viết toàn bộ lệnh trong một dòng đơn)

Save rằng vào một tập tin, ví dụ myscript, và làm cho nó thực thi:

chmod +x myscript 
.

Bây giờ bạn có thể thực thi tập lệnh đó giống như các chương trình khác trên máy. Nhưng nếu bạn không đặt nó bên trong một thư mục được liệt kê trong biến môi trường PATH của bạn (ví dụ: /usr/local/bin hoặc trên một số bản phân phối Linux ~/bin), thì bạn sẽ cần chỉ định đường dẫn đến tập lệnh đó. Nếu nó nằm trong thư mục hiện tại, bạn thực hiện nó với:

./myscript 

Các lệnh trong tập lệnh hoạt động giống như các lệnh trong ví dụ đầu tiên; lệnh tiếp theo chỉ thực thi nếu lệnh trước đó đã thành công. Để thực hiện vô điều kiện tất cả các lệnh, chỉ cần liệt kê mỗi lệnh trên một dòng riêng:

#! /bin/sh 
cd /my_folder 
rm *.jar 
svn co path to repo 
mvn compile package install 
+8

+1 để có câu trả lời hay. –

+2

+1. Đây chính xác là những gì tôi đang tìm kiếm! –

+21

Đối với người đọc trong tương lai: Bạn cũng có thể sử dụng '||' thay vì dấu chấm phẩy hoặc '&& 'nếu bạn chỉ muốn lệnh tiếp theo được thực hiện nếu lệnh cuối cùng không thành công. Như trong thử này, và nếu nó không thành công, hãy thử điều đó. – DeVadder

1
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install 
+0

không giống như tập lệnh OP, vui lòng giải thích: nếu lệnh aa không thành công, tập lệnh sẽ hủy bỏ –

+3

Ngoài ra, bạn có thể sử dụng 'cmd1 || cmd2' separator nếu bạn cần 'cmd2' để thực hiện chỉ khi' cmd1' trả về trạng thái không khác về shell, và bạn có thể sử dụng 'cmd1; cmd2' nếu bạn muốn chạy cả hai lệnh bất kể trạng thái trả về của chúng. –

+0

@sputnick Nó phải là, tôi chỉ dán nó vào và ghép các lệnh với && –

9

Bạn có thể tách các lệnh bằng cách sử dụng dấu hai chấm bán:

cd /my_folder;rm *.jar;svn co path to repo;mvn compile package install 

Đó có phải là những gì bạn nghĩa là gì?

1

Nếu bạn muốn thực hiện tất cả các lệnh, cho dù trước đó thực hiện hay không, bạn có thể sử dụng dấu chấm phẩy (;) để tách các lệnh.

cd /my_folder; rm *.jar; svn co path to repo; mvn compile package install 

Nếu bạn muốn thực hiện lệnh tiếp theo chỉ khi lệnh trước đó thành công, sau đó bạn có thể sử dụng & & để tách các lệnh.

cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install 

Trong trường hợp của bạn, việc thực hiện các lệnh liên tiếp dường như phụ thuộc vào các lệnh trước, vì vậy hãy sử dụng ví dụ thứ hai i.e. sử dụng & & để tham gia các lệnh.

36

Tôi thấy rằng việc sử dụng; để tách các lệnh chỉ hoạt động ở nền trước. ví dụ:

cmd1; cmd2; cmd3 & - sẽ chỉ thực hiện cmd3 ở chế độ nền, trong khi cmd1 && cmd2 && cmd3 & - sẽ thực thi toàn bộ chuỗi trong nền IF không có lỗi.

Để phục vụ cho thực hiện vô điều kiện, sử dụng dấu ngoặc đơn giải quyết này:

(cmd1; cmd2; cmd3) & - sẽ thực hiện chuỗi các lệnh ở chế độ nền, ngay cả khi bất cứ bước nào thất bại.

+1

Ký tự dấu và (&) trong ví dụ của bạn có chủ ý không? Nếu vậy, nó là gì? – Technophile

+4

@Technophile Nó chạy [lệnh nền] (http://unix.stackexchange.com/questions/103731/run-a-command-without-making-me-wait) –

+0

Một câu trả lời đơn giản, ngắn gọn và trực tiếp, bạn nên sử dụng các trang web StackExchange thường xuyên hơn Dean. Cảm ơn vì đầu vào của bạn. – CPHPython

0

Tiện ích của chỉ một dấu gạch ngang là gì? Sáng nay, tôi đã thực hiện một phóng trong bảng điều khiển XFCE (trong Manjaro + XFCE) để khởi động 2 mật khẩu quản lý cùng một lúc:

sh -c "keepassx && password-gorilla" 
or 
sh -c "keepassx; password-gorilla" 

Nhưng nó không hoạt động như tôi muốn. IE, là người đầu tiên bắt đầu ứng dụng nhưng bắt đầu chỉ đứng sau khi trước đó đã đóng: -/

Tuy nhiên, tôi thấy rằng (với chỉ có một và):

sh -c "keepassx & password-gorilla" 

và nó hoạt động như tôi muốn bây giờ. ..

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