Khi nào thì viết kịch bản di động là quan trọng?


18

Hầu hết các mã tôi viết là trong PHP. Gần đây tôi đã bắt đầu học kịch bản shell. Hầu hết các tài nguyên và hướng dẫn mà tôi đi qua đều dành riêng cho Bash. Một số cảnh báo về bashism và một số thì không. Tôi đã đọc rất nhiều ở đây và Stack Overflow.

Bất cứ khi nào một câu trả lời sử dụng bashism , chắc chắn ai đó sẽ bình luận để nói:

Bạn không nên sử dụng <insert bashism tại đây>. Nó không phải là di động.

Điều này xảy ra ngay cả khi câu hỏi được gắn thẻ bash. Đối với tôi, điều đó giống như nói với một lập trình viên PHP rằng họ không nên sử dụng mã mới trong PHP 5 vì nó không thể được sử dụng với PHP 4. Hoặc nói với ai đó rằng họ không nên viết một cái gì đó cho Mac vì không thể sử dụng nó trên Windows.

Khi tôi viết bằng PHP, tôi chọn một yêu cầu tối thiểu và tôi viết mã tương thích về phía trước . Tôi không lo lắng về việc làm cho nó tương thích ngược .

Nếu tôi sử dụng #!/bin/bashnhư shebang, tại sao tôi không nên sử dụng bashism? Tôi bắt đầu để có được ấn tượng rằng một số người giống như để bash bashisms (ý định chơi chữ) chỉ vì lợi ích của nó.

Mọi người thường sử dụng bashshellhoán đổi cho nhau - có lẽ do thực tế là bash là vỏ mặc định trên nhiều hệ thống. Vì vậy, tôi có thể hiểu việc thêm một nhận xét để cảnh báo rằng mã sử dụng bashism, nhưng tôi không hiểu hàm ý rằng việc sử dụng chúng là sai .

Rõ ràng, nếu tôi đang viết một kịch bản cho mục đích cá nhân, tôi có thể viết nó bằng bất kỳ ngôn ngữ nào tôi muốn. Nhưng tôi muốn nghĩ rằng một số mã tôi viết có thể hữu ích cho những người khác.

Tôi đã cố gắng tìm kiếm một câu trả lời cho câu hỏi của tôi trước khi đăng. Tôi thấy rất nhiều thông tin về cách thức để kiểm tra cho tính di động, nhưng không thể tìm thấy bất cứ điều gì về khi điều quan trọng là phải làm như vậy.

Vì vậy, khi nào là quan trọng để viết kịch bản di động?

Ví dụ,

  • Những loại kịch bản nên càng di động càng tốt?
  • Làm thế nào phổ biến là các hệ thống không cài đặt Bash?
  • nếu hệ thống đã Bash cài đặt, nó cũng sẽ có phiên bản GNU của find và các tiện ích khác?

4
Tôi đã nêu lên câu hỏi này và trả lời nó, nhưng tôi càng nghĩ về nó chỉ có 2 câu hỏi cuối cùng phù hợp với trang web. Những người khác "chủ yếu dựa trên ý kiến".
jordanm

1
Ngoài ra còn có một khía cạnh meta trong câu hỏi này: Mặc dù nó có thể không giúp trả lời ban đầu cho câu hỏi, nhưng những bình luận như "đây không phải là di động" có thể rất hữu ích cho những người đọc khác vấp phải câu hỏi / câu trả lời nhiều tháng hoặc nhiều năm sau.
Bananguin

2
@Bananguin Bình luận nói rằng "đây không phải là di động" đừng làm phiền tôi. Đó chỉ là một FYI. Tôi đã thực hiện những loại bình luận đó bản thân mình. Đó là "Bạn không nên sử dụng ..." làm phiền tôi. Nó ngụ ý rằng có một cái gì đó sai với câu trả lời. Điều đó sẽ hợp lệ nếu ví dụ câu trả lời đề xuất mã không dùng nữa. Vì vậy, nó đã khiến tôi tự hỏi có gì sai với Bash.
toxalot

2
+1. Đặc biệt là khi câu hỏi chỉ có bashthẻ, một người nào đó nhận xét "Đó là bashism và không di động". Khi tôi trả lời một câu hỏi được gắn thẻ C, tôi không quan tâm liệu nó có di động Javahay không.
PP

4
Tôi cảm thấy thật tốt khi chỉ ra rằng đó là một bashtính năng cụ thể và không khả chuyển, giống như tôi chỉ ra rằng một phần mở rộng cụ thể của GNU đang được sử dụng cho một số tiện ích (mặc dù câu hỏi được gắn thẻ là Linux). Tôi chưa bao giờ thấy ai nói rằng "đây là một bashism và bạn không bao giờ nên sử dụng nó".
Martin Tournoij

Câu trả lời:


15

Là một thành viên của cộng đồng này, tôi không thường thấy mọi người coi thường bashism cho những thứ nhắm vào bash. Khi nói về tính di động, GNUism tệ hơn nhiều so với bashism. Miễn là bạn sử dụng bashcho shebang của mình, bạn có thể mong đợi tập lệnh được thực thi bằng cách sử dụng bash. Tuy nhiên, bạn không thể đảm bảo phiên bản trừ khi bạn kiểm tra rõ ràng. Bash phiên bản 4 mang lại một số tính năng hữu ích như mảng kết hợp, nhưng Bash v3 vẫn được sử dụng rộng rãi trên OS X và RHEL 5.

Những loại kịch bản nên càng di động càng tốt?

Đây là nhiều hơn về nhu cầu của bạn và những gì bạn chọn để hỗ trợ như nhà phát triển. Nếu bạn đang viết một tập lệnh cài đặt cho một ứng dụng hỗ trợ tất cả các loại * NIX, thì tính di động sẽ rất quan trọng.

Làm thế nào phổ biến là các hệ thống không cài đặt Bash?

FreeBSD và Solaris 10 là những ví dụ về các hệ thống không đi kèm với bash được cài đặt theo mặc định. Hầu hết các hệ thống Linux sẽ có nó, ngoại trừ các hệ thống nhúng.

nếu hệ thống đã cài đặt Bash, nó cũng sẽ có phiên bản GNU và các tiện ích khác phải không?

Không, và đây là vấn đề thực sự với tính di động. Nếu tính di động là quan trọng, bạn chỉ nên sử dụng các tính năng lệnh shell được xác định bởi tiêu chuẩn POSIX. Các tiện ích GNU có thể được cài đặt trên các hệ thống không phải GNU như FreeBSD, nhưng chúng không có khả năng là đầu tiên trong PATH và bạn không thể dựa vào các công cụ được cài đặt.


1
Tôi nghĩ rằng đó là về SO nhiều hơn ở đây, nơi tôi thường thấy mọi người coi thường bashism . Tôi chỉ biết rằng tôi đã nhận thấy nó thường đủ để làm tôi thất vọng và nhắc tôi hỏi câu hỏi này.
toxalot

1
Vì vậy, nếu các tiện ích GNU được cài đặt nhưng không phải đầu tiên trong PATH, có cách nào để gọi chúng một cách cụ thể không? Nếu không, tại sao chúng đã được cài đặt ở tất cả?
độc tố

@toxalot: Binaries và script được gọi một cách rõ ràng bằng cách sử dụng các đường dẫn tuyệt đối.
Bananguin

1
@Bananguin Vì vậy, nếu ai đó đã cài đặt các tiện ích Bash và GNU (nhưng không phải trong PATH), họ có thể sử dụng tập lệnh nếu họ chỉnh sửa nó để sử dụng các đường dẫn tuyệt đối cho findvà bất kỳ tiện ích cụ thể nào khác của GNU mà tôi đã sử dụng? Rõ ràng, điều đó sẽ không thân thiện với người dùng đối với tập lệnh cài đặt. Nhưng tôi đang nghĩ chỉ cần đưa thứ gì đó lên GitHub để người khác lấy nếu họ mong muốn. Tôi không quan tâm rằng nó không khả dụng cho mọi hệ thống. Tôi chỉ không muốn nó vô dụng trên nhiều hệ thống.
toxalot

1
@toxalot: có mà có thể làm việc. nếu bạn đặt một cái gì đó giống như FIND=/opt/gnu/dispicable/bin/findở đầu tập lệnh của bạn và sau đó sử dụng ${FIND}thay vì findtrong tập lệnh của bạn, bạn cung cấp cho mọi người một vị trí (!) để đặt đường dẫn cài đặt của họ và làm cho tập lệnh của bạn sử dụng đúng công cụ.
Bananguin

5

Vì vậy, khi nào là quan trọng để viết kịch bản di động?

Những loại kịch bản nên càng di động càng tốt?

Khi bạn đang sử dụng chúng cho môi trường làm việc của bạn và bạn làm việc (hoặc có thể trong tương lai) trên các máy khác nhau - VÀ, bạn không muốn phải viết lại các công cụ của mình trước khi bắt đầu làm việc.

ví dụ: tập lệnh rác / rm thay thế


Đánh dấu:

... cho bộ công cụ xử lý sự cố của tôi, tôi giả sử tôi sẽ chỉ có vỏ vi và Korn. Và tôi cố gắng sử dụng các lệnh hoạt động trên hầu hết các hương vị của Unix.


3
Tôi thích một số "Bash-isms" bóng bẩy nhưng đối với bộ công cụ xử lý sự cố của tôi, tôi cho rằng tôi sẽ chỉ có vỏ vi và Korn. Và tôi cố gắng sử dụng các lệnh hoạt động trên hầu hết các hương vị của Unix. Bằng cách đó, tôi đã sẵn sàng để xử lý một hệ thống bị bệnh mà không phải lo lắng về cách lệnh ps hoạt động, cho dù Bash hay Perl hay PHP đang ở đó, hoặc chúng ở đâu.
Mark Stewart
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.