/ Thùng / dấu gạch ngang là gì?


27

Tôi nghĩ /bin/shlà một liên kết đến vỏ của sự lựa chọn của tôi. Tôi đã luôn luôn sử dụng bash, vì vậy tôi cho rằng /bin/shsẽ chỉ đến /bin/bash. Nó chỉ ra, mặc dù, nó chỉ đến /bin/dash.

Nó trở nên buồn cười hơn. Tôi bắt đầu dashvà làm echo $SHELLvà nó in /bin/bash(vì vậy về cơ bản chúng giống nhau?). Tuy nhiên, trang người đàn ông dashhoàn toàn khác với trang người đàn ông của bash(vì vậy chúng không giống nhau?).


1
@wzzrd, câu hỏi này có phải dành riêng cho linux không?
aioobe

1
thở dài, tôi không thể đưa ra tất cả những câu trả lời hay này, vì tôi cần 15 rep. Tôi cảm thấy bị tàn phế khi tôi có 18k trên stackoverflow: - /
aioobe

4
mmm dash .. những gì về / bin / crash (đối với người hâm mộ gdb), / bin / slash (chương trình thắt lưng buộc bụng), / bin / mash (thời gian khó khăn ở Hàn Quốc), / bin / sash (đối với người cổ vũ), / bin / thrash (cứng trên ổ cứng của bạn), / bin / flash (nhưng chỉ khi bạn mã hóa dữ liệu của mình), / bin / stash (chúc may mắn tìm thấy nó sau), / bin / tiền mặt (bạn luôn luôn có tiền), / bin / pash (lãng mạn PC), / bin / gash (aaargggh!).
PP.

2
@PP - Tôi đã đọc / bin / thrash cho người hâm mộ nhạc Metal và / bin / slash cho người hâm mộ của các tay guitar chính của ban nhạc rock 80 ... :-P
gWaldo

1
Lý do echo $SHELLin /bin/bashlà vì biến đó được đặt cho shell mặc định bắt đầu khi bạn đăng nhập thay vì shell hiện tại bạn đang chạy. Bắt đầu ksh hoặc zsh từ dấu nhắc Bash và echo $SHELLvẫn sẽ nói /bin/bash. Sử dụng psđể xem những gì hiện đang chạy.
Tạm dừng cho đến khi có thông báo mới.

Câu trả lời:


43

Debian và Ubuntu chuyển sang dash (iirc) vì một vài điều. Trước hết, Bash đã trở nên lớn trong những năm qua. Trên thực tế, /bin/bashhệ số nhị phân trên hệ thống Ubuntu 8.04 của tôi lớn gần gấp mười lần (!) /bin/dash. Bây giờ, điều đó không quan trọng lắm đối với việc sử dụng vỏ hàng ngày, nhưng nó quan trọng trong các tình huống sau:

  • Dash nhỏ hơn nhiều và do đó tải nhanh hơn, đó là một lợi ích cho init-scripts. Nếu bạn phải bắt đầu rất nhiều trong số chúng, hãy tải Dash thay vì Bash mỗi lần, tăng tốc mọi thứ lên đáng kể.
  • Do kích thước nhỏ hơn của Dash, Debian và Ubuntu có thể loại bỏ một khối khá lớn kích thước của initrd của chúng, để lại nhiều chỗ hơn cho các thứ khác (và một lần nữa, tăng tốc mọi thứ).

Nhược điểm của việc sử dụng Dash thay vì Bash cho kịch bản, là rất nhiều người sử dụng các cú pháp cú pháp chỉ Bash có, cái gọi là Bashism . Ví dụ về Bashism là các chuỗi con, như thế này:

echo $SHELL
/bin/bash
a=1234567890
echo ${a}
1234567890
echo ${a:3}
4567890
echo ${a:3:1}
4

Và cái này:

echo ${a#123}
4567890

Mặt khác, Dash chủ yếu nhằm mục đích tuân thủ POSIX (và không hơn thế), sẽ gây ra lỗi cho trạm biến áp xấu nếu bạn thử điều này:

echo $SHELL
/bin/dash 
# actually, it will read /bin/bash above, because if you just run dash
# it will not set the $SHELL variable :)
a=1234567890
echo ${a}
1234567890
echo ${a:3}
dash: Bad substitution

Điều này sẽ có vấn đề nếu bạn sử dụng /bin/sh(và do đó dash) làm thông dịch viên cho các bản sao của bạn và sử dụng Bashism trong chúng. Debian và Ubuntu có các trang wiki hay về Bashism và tại sao chúng lại tệ trong các bản mô tả nói chung và các tập lệnh init nói riêng. Do đó, bạn nên có ý thức lựa chọn xem bạn cần /bin/shhay /bin/bashlà người phiên dịch cho kịch bản của bạn.

Dash không được sử dụng làm vỏ mặc định trên hệ thống của bạn. Chỉ cần sử dụng Bash cho điều đó. Đối với tính di động của các tập lệnh của bạn, bạn có thể sử dụng Dash làm trình thông dịch để tăng tỷ lệ cược các tập lệnh sẽ chạy trên các hương vị Linux và Unix khác.


1
Nếu bạn viết kịch bản với Bashism, vui lòng ghi rõ /bin/bash; nhiều hệ thống không phải là Linux có hệ shvỏ thực tế thậm chí không tương thích với bash.
Chris S

echo ${a#123}không phải là một bashism, nó là một phần của thông số mở rộng Thông số POSIX. pubs.opengroup.org/onlinepubs/009695399/utilities/... Bạn chỉ cần không nhận được sed những phong cách Bash tiên tiến hơn, Những người posix được substring phong cách + ký tự mở rộng đơn giản. Có nghĩa là, POSIX cũng cho phépecho ${a#*6}
JM Becker



0

Vì không phải tất cả các shell được đặt $SHELLkhi chạy, bạn tìm ra shell hiện tại của mình với:

echo $0

Nếu nó báo lỗi, đó là csh, nếu không, đó là lỗi argv[0]mà bạn đã được gọi, thường là shell, có lẽ có -dấu gạch nối hàng đầu , để chỉ ra rằng đó là shell đăng nhập.

Điều này không được đảm bảo , vì argv[0]nằm dưới sự kiểm soát của quá trình gọi, nhưng thực tế nó là phương pháp đáng tin cậy nhất.

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.