it-swarm-vi.tech

Bash hay KornShell (ksh)?

Tôi không phải là người mới đối với * nix, tuy nhiên gần đây tôi đã dành rất nhiều thời gian tại Prompt. Câu hỏi của tôi là những lợi thế của việc sử dụng KornShell (ksh) hoặc Bash Shell là gì? Đâu là những cạm bẫy của việc sử dụng cái này hơn cái kia?

Nhìn để hiểu từ quan điểm của một người dùng, thay vì hoàn toàn là kịch bản.

59
user13158

Bash.

Các triển khai UNIX và Linux khác nhau có các triển khai ksh cấp nguồn khác nhau, một số trong đó là ksh thực, một số trong đó là triển khai pdksh và một số trong đó chỉ là liên kết đến một số Shell khác có tính cách "ksh". Điều này có thể dẫn đến sự khác biệt kỳ lạ trong hành vi thực thi.

Ít nhất với bash, bạn có thể chắc chắn rằng đó là một cơ sở mã duy nhất và tất cả những gì bạn cần lo lắng là phiên bản bash (thường là tối thiểu) được cài đặt. Đã thực hiện rất nhiều kịch bản trên hầu hết các UNIX hiện đại (và không hiện đại), lập trình để bash phù hợp hơn với kinh nghiệm của tôi.

46
j.e.hahn

Sự khác biệt giữa Kornshell và Bash là tối thiểu. Có một số lợi thế nhất định so với cái khác, nhưng sự khác biệt là rất nhỏ:

  • BASH dễ dàng hơn nhiều để đặt Lời nhắc hiển thị thư mục hiện tại. Để làm điều tương tự trong Kornshell là hackish.
  • Kornshell có mảng kết hợp và BASH thì không. Bây giờ, lần cuối cùng tôi sử dụng mảng Associative là ... Hãy để tôi nghĩ ... Không bao giờ.
  • Kornshell xử lý cú pháp vòng lặp tốt hơn một chút. Bạn thường có thể đặt giá trị trong vòng lặp Kornshell và có sẵn giá trị đó sau vòng lặp.
  • Bash xử lý nhận mã thoát khỏi đường ống theo cách sạch hơn.
  • Kornshell có lệnh print tốt hơn lệnh echo.
  • Bash có hoàn thành tab. Trong các phiên bản cũ hơn
  • Kornshell có lệnh r history cho phép tôi nhanh chóng chạy lại các lệnh cũ hơn.
  • Kornshell có cú pháp cd old new thay thế old bằng new trong thư mục và đĩa CD ở đó. Thật tiện lợi khi bạn có trong một thư mục có tên /foo/bar/barfoo/one/bar/bar/foo/bar và bạn cần cd sang /foo/bar/barfoo/two/bar/bar/foo/bar Trong Kornshell, bạn chỉ cần làm cd one two và được thực hiện với nó. Trong BASH, bạn phải cd ../../../../../two/bar/bar/foo/bar.

Tôi là một anh chàng Kornshell cũ bởi vì tôi đã học Unix vào những năm 1990 và đó là sự lựa chọn của Shell hồi đó. Tôi có thể sử dụng Bash, nhưng đôi khi tôi cảm thấy thất vọng vì nó theo thói quen tôi sử dụng một số tính năng nhỏ mà Kornshell có BASH không và nó không hoạt động. Vì vậy, bất cứ khi nào có thể, tôi đặt Kornshell làm mặc định của mình.

Tuy nhiên, tôi sẽ bảo bạn học BASH. Bash hiện được triển khai trên hầu hết các hệ thống Unix cũng như trên Linux và đơn giản là có nhiều tài nguyên hơn để học BASH và nhận trợ giúp hơn Kornshell. Nếu bạn cần làm điều gì đó kỳ lạ trong BASH, bạn có thể truy cập Stackoverflow, đăng câu hỏi của mình và bạn sẽ nhận được hàng tá câu trả lời trong vài phút - và một số trong số đó thậm chí sẽ chính xác!.

Nếu bạn có câu hỏi về Kornshell và đăng nó lên Stackoverflow, bạn sẽ phải chờ một số tin tặc cũ của họ như tôi thức dậy từ giấc ngủ ngắn của anh ấy trước khi bạn nhận được câu trả lời. Và, quên nhận bất kỳ phản hồi nào nếu họ đang phục vụ trong ngôi nhà cũ kỹ ngày hôm đó.

BASH bây giờ đơn giản là Shell của sự lựa chọn, vì vậy nếu bạn phải học một cái gì đó, cũng có thể đi với những gì phổ biến.

122
David W.

Tôi là một cựu chiến binh Korn-Shell, vì vậy hãy biết rằng tôi nói từ quan điểm đó.

Tuy nhiên, tôi đã cảm thấy thoải mái với Bourne Shell, ksh88 và ksh93, và đối với hầu hết tôi biết những tính năng nào được hỗ trợ trong đó. (Tôi nên bỏ qua ksh88 ở đây, vì nó không được phân phối rộng rãi nữa.)

Để sử dụng tương tác, lấy bất cứ điều gì phù hợp với nhu cầu của bạn. Thí nghiệm. Tôi thích có thể sử dụng cùng Shell để sử dụng tương tác và lập trình.

Tôi đã đi từ ksh88 trên SVR2 đến tcsh, đến ksh88Sun (đã thêm hỗ trợ quốc tế hóa quan trọng) và ksh93. Tôi đã thử bash, và ghét nó vì nó làm phẳng lịch sử của tôi. Sau đó tôi phát hiện ra shopt -s lithist và tất cả đều tốt (Tùy chọn lithist đảm bảo rằng các dòng mới được giữ nguyên trong lịch sử lệnh của bạn.)

Đối với lập trình Shell, tôi thực sự khuyên dùng ksh93 nếu bạn muốn có ngôn ngữ lập trình nhất quán, tuân thủ POSIX tốt và hiệu suất tốt, vì nhiều lệnh unix phổ biến có thể có sẵn như các hàm dựng sẵn.

Nếu bạn muốn tính di động sử dụng ít nhất cả hai. Và chắc chắn rằng bạn có một bộ kiểm tra tốt.

Có nhiều sự khác biệt tinh tế giữa các vỏ. Xem xét ví dụ đọc từ một đường ống:

b=42 && echo one two three four |
    read a b junk && echo $b

Điều này sẽ tạo ra kết quả khác nhau trong các vỏ khác nhau. Korn-Shell chạy các đường ống từ sau ra trước; phần tử cuối cùng trong đường ống chạy trong quy trình hiện tại. Bash đã không hỗ trợ hành vi hữu ích này cho đến v4.x và thậm chí sau đó, nó không phải là mặc định.

Một ví dụ khác minh họa tính nhất quán: Lệnh echo, đã bị lỗi thời bởi sự phân chia giữa BSD và SYSV unix và mỗi quy tắc giới thiệu riêng về việc không in dòng mới (và hành vi khác). Kết quả của điều này vẫn có thể được nhìn thấy trong nhiều tập lệnh 'configure'.

Ksh đã thực hiện một cách tiếp cận triệt để với điều đó - và giới thiệu lệnh print, thực sự hỗ trợ cả hai phương thức (-n tùy chọn từ BSD và dấu \c ký tự đặc biệt từ SYSV)

Tuy nhiên, đối với lập trình hệ thống nghiêm túc, tôi muốn giới thiệu một cái gì đó ngoài Shell, như python, Perl. Hoặc tiến thêm một bước và sử dụng một nền tảng như con rối - cho phép bạn xem và sửa trạng thái của toàn bộ cụm hệ thống, với khả năng kiểm toán tốt.

Lập trình Shell giống như bơi trong vùng nước chưa được khám phá, hoặc tệ hơn.

Lập trình trong bất kỳ ngôn ngữ nào cũng đòi hỏi phải làm quen với cú pháp, giao diện và hành vi của nó. Lập trình Shell không có gì khác biệt.

28
Henk Langeveld

Đây là một chút của một trận chiến Unix vs Linux. Hầu hết nếu không phải tất cả các bản phân phối Linux đều có cài đặt bash và ksh tùy chọn. Hầu hết các hệ thống Unix, như Solaris, AIX và HPUX đều có ksh là mặc định.

Cá nhân tôi luôn sử dụng ksh, tôi thích hoàn thành vi và tôi sử dụng Solaris khá nhiều cho mọi thứ.

4
Kristian

Đối với tập lệnh, tôi luôn sử dụng ksh vì nó trơn tru hơn gotchas .

Nhưng tôi thấy bash thoải mái hơn khi sử dụng tương tác. Đối với tôi, các ràng buộc chính emacs và hoàn thành tab là những lợi ích chính. Nhưng đó chủ yếu là lực lượng của thói quen, không phải bất kỳ vấn đề kỹ thuật nào với ksh .

4
Jon Ericson

Tôi không có kinh nghiệm với ksh, nhưng tôi đã sử dụng cả bash và zsh. Tôi thích zsh hơn bash vì nó hỗ trợ toàn cầu tập tin rất mạnh, sửa đổi mở rộng biến và hoàn thành tab nhanh hơn.

Đây là phần giới thiệu nhanh: http://friedcpu.wordpress.com/2007/07/24/zsh-the-last-Shell-youll-ever-need/

4
Chris AtLee

Câu trả lời của tôi sẽ là 'chọn một và học cách sử dụng nó'. Cả hai đều là vỏ sò; bash có thể có nhiều chuông và còi hơn, nhưng cả hai đều có các tính năng cơ bản mà bạn muốn. bash là phổ biến hơn những ngày này. Nếu bạn đang sử dụng Linux mọi lúc, chỉ cần sử dụng nó.

Nếu bạn đang lập trình, cố gắng bám vào 'sh' đơn giản để có tính di động là một cách tốt, nhưng sau đó với bash có sẵn rất rộng rãi trong những ngày này mà lời khuyên có lẽ hơi lỗi thời.

Tìm hiểu cách sử dụng hoàn thành và lịch sử Shell của bạn; thỉnh thoảng đọc manpage và cố gắng học một vài điều mới.

3
Incident

@foxxtrot

Trên thực tế, Shell tiêu chuẩn là Bourne Shell (sh). /bin/sh trên Linux thực ra là bash, nhưng nếu bạn đang nhắm đến các tập lệnh đa nền tảng, tốt hơn hết bạn nên sử dụng các tính năng của Bourne Shell ban đầu hoặc viết nó vào một cái gì đó như Perl .

3
Hank Gay

Đối với một điều, bash đã hoàn thành tab. Chỉ điều này là đủ để làm cho tôi thích nó hơn ksh.

Z Shell có sự kết hợp tốt giữa các tính năng độc đáo của ksh với những thứ Nice mà bash cung cấp, cùng với nhiều thứ khác ở trên đó.

2
Allen

Có sẵn trong hầu hết các hệ thống UNIX, ksh là tiêu chuẩn, được thiết kế rõ ràng, được làm tròn. Tôi nghĩ rằng sách, giúp trong ksh là đủ và rõ ràng, đặc biệt là cuốn sách O'Reilly. Bash là một khối. Tôi chỉ giữ nó dưới dạng root đăng nhập Shell cho Linux ở nhà.

Để sử dụng tương tác, tôi thích zsh trên Linux/UNIX. Tôi chạy tập lệnh trong zsh, nhưng tôi sẽ kiểm tra hầu hết các tập lệnh, chức năng của mình trong AIX ksh.

2
MeaCulpa