2008-09-16 25 views
51

Tôi không quen với * nix, tuy nhiên gần đây tôi đã dành rất nhiều thời gian tại dấu nhắc. 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 một trong những khác?Bash hoặc KornShell (ksh)?

Tìm cách hiểu từ góc nhìn của người dùng, thay vì hoàn toàn là tập lệnh.

Trả lời

41

Bash. Các triển khai UNIX và Linux khác nhau có nhiều triển khai cấp nguồn khác nhau của ksh, một số trong đó là ksh thực, một số trong đó là các triển khai pdksh và một số trong số đó chỉ là các 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 lạ trong hành vi thực hiện.

Í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 mọi UNIX hiện đại (và không phải là hiện đại), lập trình để bash là phù hợp hơn đáng tin cậy trong kinh nghiệm của tôi.

+0

Nếu bạn đang làm chỉ ksh mẫu số chung tối thiểu, tôi đồng ý. Chính hãng David Korn ksh93, mặt khác, có những lợi thế hấp dẫn cho kịch bản: Tốc độ đặt nó gần 'awk' để xử lý văn bản; bản toán dấu chấm động bản địa; namevars và mảng kết hợp ngay cả trên các hệ thống không chạy bản phát hành mới nhất; v.v. –

13

Đừng quên zsh.

0

Bash là điểm chuẩn, nhưng đó chủ yếu là vì bạn có thể chắc chắn rằng nó được cài đặt trên mọi nix * ra khỏi đó. Nếu bạn định phân phối các tập lệnh, hãy sử dụng Bash.

Tôi không thể thực sự giải quyết sự khác biệt về lập trình thực sự giữa các trình bao, thật không may.

+1

Nếu bạn định phân phối tập lệnh, hãy sử dụng posix-sh. Bash là trình bao tốt và mặc định trên Linux. Các hương vị Unix cũ hơn có xu hướng có sh, ksh và csh. Trong một môi trường sản xuất, rất khó để có được sự cho phép hoặc tha thứ cho việc cài đặt trình bao lựa chọn của bạn trên tất cả các hệ thống. –

+2

Nó không được cài đặt theo mặc định trên AIX chúng tôi sử dụng tại nơi làm việc (tổ chức tài chính lớn của Hoa Kỳ), và cậu bé tôi muốn nó được. –

2

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

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

+3

ksh đã hoàn tất, chỉ cần không có phím tab. – user13158

+2

'ksh --version':" phiên bản sh (Nghiên cứu AT & T) 93t + 2009-05-01 "đã hoàn tất tab và hoàn thành Esc. –

+2

Theo mặc định, ksh sử dụng để hoàn thành trong trường hợp có ai đó tò mò. Nguồn: http://kornshell.com/doc/faq.html – Katerberg

3

@foxxtrot

Trên thực tế, vỏ giữa các ý kiến ​​Bourne shell (sh). /bin/sh trên Linux thực sự là bash, nhưng nếu bạn đang nhắm đến các tập lệnh đa nền tảng, bạn nên gắn bó với các tính năng của vỏ Bourne gốc hoặc ghi nó vào một cái gì đó như perl.

+0

Lưu ý rằng bash có hành vi khác nếu/bin/sh là (sym) được liên kết với bash: Nếu bash được gọi với tên sh, nó sẽ cố bắt chước khởi động hành vi của các phiên bản lịch sử của sh càng chặt chẽ càng tốt, trong khi cũng tuân theo tiêu chuẩn POSIX. –

+3

Trên Debian, tiêu chuẩn '/ bin/sh' thực sự là' dấu gạch ngang ', vỏ almquist debian. Điều này khiến nhiều người phải trả lời khi các lệnh bash "hợp lệ" của họ bị từ chối bởi '#!/Bin/sh' – thom

3

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ỏ tốt; bash có thể có nhiều chuông và còi hơn, nhưng cả hai đều có những tính năng cơ bản mà bạn sẽ muốn. bash là phổ biến hơn có sẵn những ngày này. Nếu bạn đang sử dụng Linux mọi lúc, chỉ cần gắn bó với nó.

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

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

+0

Do câu trả lời này, ksh93 cho là có nhiều chuông và còi hơn từ góc độ lập trình (mảng kết hợp và tên gọi đến đầu tiên để tâm trí) - mặc dù đó là thay đổi trong tám năm can thiệp. Nó vẫn có toán học dấu chấm động, mà bash tiếp tục thiếu. –

4

Đây là một trận chiến giữa Unix và 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ó mặc định là ksh.

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

+0

HP-UX cung cấp sh, csh và ksh làm shell mặc định. Trong 11,31 bash đã được đưa vào phương tiện cài đặt mặc định. Nhưng, với số tiền 10,20 vẫn đang chạy trên thế giới, ksh vẫn là một lựa chọn tốt hơn cho việc quản lý HP-UX. –

+0

Bạn có thể sử dụng vi hoàn thành trong bash bằng 'set -o vi', và thêm nó vào tệp' ~/.bashrc' của bạn để làm cho nó liên tục. Đó là cách tôi đã đặt. – Wildcard

-2

Bash là tiêu chuẩn cho Linux.
Kinh nghiệm của tôi là dễ dàng tìm kiếm trợ giúp cho bash hơn là cho ksh hoặc csh.

+1

Tôi muốn nói _bash_ là _a_ standard. ;-) –

+1

bash chỉ là tiêu chuẩn cho Linux. Vỏ Bourne gốc (sh) là tiêu chuẩn cho các tập lệnh đa nền tảng. –

+2

Posix-sh là (hoặc có lẽ 'nên là') tiêu chuẩn cho kịch bản nền tảng chéo. –

4

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

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

+0

ý của bạn là "sử dụng tương tác"? – amphibient

+1

@foampile: Khi bạn nhập vào dòng lệnh đầu cuối. ;-) –

+0

tôi nghĩ vậy. cảm ơn – amphibient

25

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

Tuy nhiên, tôi thấy thoải mái với Bourne shell, ksh88 và ksh93 và tôi biết tính năng nào được hỗ trợ trong đó.

Để sử dụng tương tác, hãy thực hiện mọi thứ 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 một trình bao để sử dụng tương tác và lập trình.

Tôi đã chuyển từ ksh88 trên SVR2 sang tcsh, thành ksh88sun 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

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.)

Để lập trình trình bao, tôi khuyên bạn nên ksh93 nếu bạn muốn một ngôn ngữ lập trình nhất quán, tuân thủ POSIX tốt và hiệu suất tốt, như nhiều unix phổ biến lệnh có thể khả dụng dưới dạng 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 loại 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 các 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 tiến trình hiện tại.

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 giới thiệu quy ước riêng của họ 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 kịch bản 'cấu hình'.

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

Tuy nhiên, đối nghiêm trọng hệ thống lập trình tôi 'd đề nghị một cái gì đó khác hơn là một vỏ, như python, perl. Hoặc tiến thêm một bước nữa, và sử dụng một nền tảng như con rối - cho phép bạn xem và chỉnh sửa trạng thái của toàn bộ các hệ thống, với việc kiểm tra tốt.

Lập trình vỏ giống như bơi trong vùng nước chưa được thám hiểm hoặc tệ hơn.

Lập trình bằng bất kỳ ngôn ngữ nào yêu cầu sự quen thuộc với cú pháp, giao diện và hành vi của nó. Shell lập trình không phải là bất kỳ khác nhau.

+0

bởi "tương tác sử dụng", bạn có nghĩa là thực hiện lệnh nhắc lệnh nhanh chóng bằng tay thay vì chạy tập lệnh bó các lệnh như vậy không? – amphibient

+2

@foampile Vâng, đó là những gì "sử dụng tương tác" có nghĩa là. – Telemachus

+1

Re: sự khác biệt 'read' của bạn, trong chế độ noninteractive thực sự có thể cấu hình cho bash hiện đại - xem tùy chọn' lastpipe'. –

108

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

  • BASH dễ dàng hơn để đặt lời nhắc hiển thị thư mục hiện tại. Để làm tương tự trong Kornshell là hackish.
  • Kornshell có mảng liên kết và BASH 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ể thiết lập một giá trị trong một vòng lặp Kornshell và có sẵn nó sau vòng lặp.
  • Bash xử lý lấy mã thoát ra từ đường ống một cách rõ ràng hơn.
  • Kornshell có lệnh print tốt hơn lệnh echo.
  • Bash có các lần hoàn thành tab. Trong các phiên bản cũ hơn
  • Kornshell có lệnh lịch sử r 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 của bạn ở đó. Thật thuận tiện khi bạn đang ở trong một thư mục có tên là /foo/bar/barfoo/one/bar/bar/foo/bar và bạn cần phải cd tới /foo/bar/barfoo/two/bar/bar/foo/bar Trong Kornshell, bạn có thể chỉ cần thực hiện cd one two và được thực hiện với nó. Trong BASH, bạn sẽ phải cd ../../../../../two/bar/bar/foo/bar.

Tôi là một anh chàng Kornshell cũ vì tôi đã học Unix vào những năm 1990 và đó là vỏ lựa chọn trở lại sau đó. Tôi có thể sử dụng Bash, nhưng thỉnh thoảng tôi cảm thấy thất vọng bởi vì trong 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 tôi.

Tuy nhiên, tôi sẽ cho bạn biết để tìm hiểu BASH. Bash hiện được thực hiện trên hầu hết các hệ thống Unix cũng như trên Linux, và chỉ có nhiều tài nguyên hơn có sẵ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ể tiếp tục Stackoverflow, đăng câu hỏi của bạn và bạn sẽ nhận được hàng chục câu trả lời sau vài phút - và một vài câu trả lời thậm chí sẽ chính xác.

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

BASH chỉ đơn giản là vỏ của sự lựa chọn bây giờ, 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ì là phổ biến.

+6

Vì mục đích hoàn chỉnh, bash phiên bản 4 hỗ trợ mảng kết hợp.Tôi đã không bao giờ sử dụng AA trong cả hai vỏ, vì vậy tôi không thể nói nếu họ làm việc tốt hơn, cũng như, hoặc tồi tệ hơn việc thực hiện Kornshell của. – chepner

+1

"Bạn thường có thể đặt giá trị trong vòng lặp Kornshell và có sẵn sau vòng lặp." - tôi thấy điều đó thật khó hiểu. tôi chắc chắn hỗ trợ rằng một biến nên có phạm vi chỉ trong phạm vi của nó làm tổ và không phải bên ngoài của nó. – amphibient

+1

Nó có liên quan đến việc chuyển một lệnh sang 'while read'loop. Kornshell không có vấn đề gì khi truy cập biến ngoài vòng lặp. Tuy nhiên, đối với BASH, đường ống đó là một tiến trình con và bạn sẽ mất giá trị khi vòng lặp hoàn tất. Có nhiều cách để giải quyết vấn đề này. –

3

Có sẵn trong hầu hết hệ thống UNIX, ksh là chuẩn-comliant, đượ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 lượng. Tôi giữ nó như là shell đăng nhập root cho Linux ở nhà mà thôi.

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

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