Tại sao tôi nhận được kết quả đầu ra khác nhau trong trường hợp sh và bash?


8

Tôi có đoạn script đơn giản sau:

#!/bin/bash
echo "Bash version ${BASH_VERSION}..."
for i in {1..99..2}
do
        echo $i
done

Đầu ra trong trường hợp tôi chạy với sh file.sh:

Bash version ...
{1..99..2}

Đầu ra trong trường hợp tôi chạy với bash file.sh:

Bash version 4.2.25(1)-release...
1
3
5
.
.
.
99

Tôi có hai truy vấn:

  1. Nếu tôi đã viết một dòng chỉ định shabang, nó không nên chạy với bash cho dù tôi sử dụng sh file.shhay bash file.sh?

  2. Tôi hiểu rằng $BASH_VERSIONkhông được nhận ra bởi sh nhưng vấn đề với vòng lặp là gì? Tại sao không in số?

Câu trả lời:


16

sh, vỏ Bourne, đã . Hành vi của nó được chỉ định bởi tiêu chuẩn POSIX . Nếu bạn muốn hành vi mới, bạn sử dụng bash, vỏ Bourne Again, được thêm các tính năng mới vào nó mọi lúc. Trên nhiều hệ thống, shchỉ bashbashbật chế độ tương thích khi chạy dưới tên đó. Trên Ubuntu, shdash, Debian Almquist vỏ.

Bản mở rộng niềng răng là một tính năng tương đối mới và cũng sẽ không có sẵn trong các bản bash cũ. Nó chắc chắn không nên ở sh.

Dòng shebang chỉ được tôn trọng nếu bạn gọi tập lệnh là tệp thực thi:

./myscript.sh

Tôi có thể đưa ra một kịch bản bất kỳ shebang nào và vẫn mở nó trong Python bằng cách chạy:

python myscript.sh

Xem những câu hỏi tuyệt vời trên Unix & Linux:


5

SH thật ngu ngốc. Nó không thể làm gì.

Nó chỉ biết các lệnh cơ bản nhất. Nó không làm gì khác.

Nó không thể hiểu {1..99} là một giá trị số. Nó hiểu nó như một chuỗi.

SH / Dash không được phát triển. Nó có nghĩa là một dấu nhắc khẩn cấp cho các trường hợp DIRE (trong chế độ tương tác. Nếu không, đó là một điều thực sự tốt cho kịch bản.).

Bash được khuyến nghị vì nó có thể làm mọi thứ SH có thể, cũng như mới nhất trong các tính năng tùy biến và mạnh mẽ.

Trong câu trả lời cho # 1, #!chỉ được phân tích cú pháp nếu chương trình được gọi trực tiếp. (như trong, ./program.sh)


6
" Nó có nghĩa là một dấu nhắc khẩn cấp cho các trường hợp DIRE. " dash, Như bạn nói cung cấp shtrong Ubuntu, không có mặt chủ yếu "là một dấu nhắc khẩn cấp cho các trường hợp DIRE" mà thay vào đó, hệ thống có thể chạy và khởi động , nhanh . Bằng cách này, dashrất thích hợp để sử dụng trong một hệ điều hành hiện đại, nhưng những gì nó cũng phù hợp cho là như một hồ sơ thấp, vỏ nhanh cho kịch bản - đặc biệt, chạy các kịch bản hệ thống khi khởi động một lớn, phức tạp, hệ điều hành hiện đại, với tối thiểu hiệu suất trên không.
Eliah Kagan

@EliahKagan Bạn thực sự chỉ sử dụng SH nếu có gì đó không ổn.
Kaz Wolfe

1
Bạn sử dụng shkhá liên tục và đặc biệt mạnh mẽ khi khởi động Ubuntu. Điều này chủ yếu quan trọng đối với việc sử dụng tập lệnh tự động của nó và đó là trường hợp sử dụng rất quan trọng trong Ubuntu. (Nếu bạn đã loại bỏ các /bin/shliên kết tượng trưng - do đó, trong thực tế, sẽ có "no SH" - mọi thứ sẽ đi khủng khiếp sai: Ubuntu không thể khởi động vào trạng thái sử dụng được.)
Eliah Kagan

@EliahKagan Lần cuối bạn sử dụng SH làm thiết bị đầu cuối ưa thích của bạn là khi nào? Tôi biết bạn sử dụng nó để viết kịch bản, nhưng khi nào bạn thực sự sử dụng nó trong chế độ tương tác?
Kaz Wolfe

2
Hôm qua, để kiểm tra xem một lệnh di động như thế nào. Nhưng quan điểm của bạn rằng việc sử dụng dấu gạch ngang tương tác là hiếm. (Và dù sao, bối cảnh sử dụng tương tác của tôi vẫn theo định hướng kịch bản.) .... Nhưng "sử dụng" không có nghĩa là "sử dụng tương tác", và quan trọng hơn, trường hợp sử dụng trong câu hỏi này không phải là tương tác!
Eliah Kagan
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.