Có mã sh nào không hợp lệ về mã bash không?


31

Có bất kỳ shmã nào không phải là mã bash hợp lệ về mặt cú pháp (sẽ không được mã hóa theo cú pháp)?

Tôi đang nghĩ về việc ghi đè shvới bashcác lệnh nhất định.


1
Tôi đoán theo tính hợp lệ Tôi có nghĩa là hợp lệ về mặt cú pháp, vì vậy nó sẽ không theo cú pháp
Alexander Mills

2
Mã thông báo khác nhau? ví dụ như ((đến với tâm trí
ccorn

1
Đối với một số distro /usr/bin/shchỉ là một liên kết sym tới /usr/bin/bash(Tôi đang sử dụng CentOS 7.3 và nó là). Bạn nên kiểm tra xem shcó thực sự bashcho bản phân phối của bạn không.
Centimane

1
Vài năm trước, toàn bộ dự án của tôi đã bị phá vỡ khi một cái gì đó được "nâng cấp" trong bash. Tôi đã phải thay đổi tất cả các dòng shebang của tôi từ #!/bin/shsang #!/bin/bash. Sau đó, mọi thứ hoạt động trở lại, vì vậy bạn thực sự phải cẩn thận. Nó có thể đã xảy ra khi họ bắt đầu sử dụng dấu gạch ngang thay vì bash cho sh.
Joe

1
@Joe, điều đó trái ngược với những gì OP đang yêu cầu - bạn đã có mã bash bị gắn nhãn sai là mã sh nhưng không phải. OP đang hỏi liệu họ có thể có mã sh (thực tế, không bị gắn nhãn sai) bị hỏng khi chạy với bash không, nếu họ có thể có mã bash bị phá vỡ khi chạy với sh (điều này là hiển nhiên - nếu tiện ích mở rộng bash không có bất kỳ ảnh hưởng nào đến các tính năng ngôn ngữ có sẵn, chúng sẽ không phải là tiện ích mở rộng).
Charles Duffy

Câu trả lời:


49

Đây là một số mã làm điều gì đó khác biệt trong POSIX sh và Bash:

hello &> world

Cho dù đó là "không hợp lệ" đối với bạn, tôi không biết.

Trong Bash, nó chuyển hướng cả đầu ra tiêu chuẩn và lỗi tiêu chuẩn từ hellotệp world. Trong POSIX sh, nó chạy hellotrong nền và sau đó thực hiện chuyển hướng trống vào world, cắt bớt nó (nghĩa là nó được coi là & >).

Có rất nhiều trường hợp khác mà các tiện ích mở rộng Bash sẽ thực hiện công việc của chúng khi chạy bên dưới bashvà sẽ có các hiệu ứng khác nhau trong POSIX thuần túy sh. Ví dụ, mở rộng cú đúp là một cách khác và nó cũng hoạt động tương tự trong chế độ POSIX của Bash và không.


Theo như lỗi cú pháp tĩnh, Bash có cả các từ dành riêng (như [[time) không được chỉ định bởi POSIX, chẳng hạn như [[ xmã shell POSIX hợp lệ nhưng là lỗi cú pháp Bash và lịch sử các lỗi không tương thích POSIX khác nhau có thể dẫn đến lỗi cú pháp, chẳng hạn như câu hỏi từ câu hỏi này :

x=$(cat <<'EOF'
`
EOF
)
bash: line 2: unexpected EOF while looking for matching ``'
bash: line 5: syntax error: unexpected end of file

Cú pháp chỉ lỗi là một định nghĩa khá nguy hiểm về "không hợp lệ" cho bất kỳ trường hợp nào có vấn đề, nhưng nó là như vậy.


3
Lưu ý rằng mặc dù hiện tại mở rộng dấu ngoặc làm cho bash (và zsh, pdksh, ksh93) không tuân thủ, POSIX đang làm việc để thêm điều khoản trong đặc tả để cho phép mở rộng dấu ngoặc (và {fd}>filemột vấn đề tương tự), do đó bash có thể tuân thủ lại (mở rộng dấu ngoặc sẽ không được chỉ định, nhưng các kịch bản tuân thủ sẽ cần phải làm echo "{a,b}"là chúng muốn {a,b}được xuất ra). Xem cuộc thảo luận đã bắt đầu nó
Stéphane Chazelas

2
Cũng liên quan đến câu hỏi và trả lời này: austingroupbugs.net/view.php?id=1191#c3983
Stéphane Chazelas

2
Ai đó sẽ viết một tập lệnh trong POSIX sh có bao giờ viết một lệnh như thế này không? OP đang đi từ sh đến bash, và theo hiểu biết của tôi thì điều này có vẻ như sẽ có nhiều vấn đề đi theo hướng khác?
Giàu

1
@Rich: Chắc chắn rồi. Tôi không sử dụng bất kỳ hệ thống nào /bin/shcó bash, vì vậy nếu tôi không chủ động nhận ra bashism này, viết một dòng lệnh điều này có thể dễ dàng xảy ra. Khoảng cách trong câu trả lời làm cho nó trông không giống nhau, nhưng hello&>worldít được truyền tải hơn.
R ..

2
Tôi thực sự đã thấy một lỗi do sự &>khác biệt chỉ tháng trước!
Gordon Davisson

16

Một ví dụ ngắn:

time()(:)

timetrong Bash là một từ dành riêng, và hành xử khác với timechương trình. Rất có khả năng bạn sẽ phá vỡ một số tập lệnh thực tế đang cố phân tích kết quả timebằng cách sử dụng bash. Nhưng về mặt kỹ thuật nó không phải là một lỗi cú pháp. Xác định lại timelà một hàm sẽ rất hiếm nhưng gây ra lỗi cú pháp vì câu hỏi này chỉ định.

Một ví dụ ngắn hơn:

a():

Hợp lệ trong dash, nhưng không tuân thủ POSIX.


3
Tổng quát hơn, bất kỳ từ nào là từ khóa không chuẩn hoặc lệnh dựng sẵn trong Bash sẽ gây ra hiệu ứng tương tự. Ngoài time, có những thứ như thế declare, function, select, và coproc. Mặc dù một số trong số đó được đánh dấu rõ ràng là không xác định trong tiêu chuẩn ( từ khóanội dung / tiện ích ), nhưng tôi không thể thấy ví dụ timehoặc coproctrong danh sách. Và sử dụng --posixdường như không có ích.
ilkkachu
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.