Tôi có thể chạy các tập lệnh Bash trong FreeBSD mà không sửa đổi chúng không?


7

Sửa lỗi cho tôi nếu tôi sai:

  • tập lệnh "sh"! = "bash"
  • Kịch bản Linux được viết bằng Bash
  • Kịch bản Bash thường #!/bin/sh
  • Trong GNU / Linux, /bin/shlà Bash
  • Trong FreeBSD, /bin/shkhông phải là bash, đó là sự thậtsh

Vì vậy, nếu tôi muốn sử dụng tập lệnh Linux trong FreeBSD và tôi chạy ./script.shtrong trình bao, nó sẽ chạy tập lệnh Bash trong "sh" chứ không phải Bash, vì /bin/shtrong FreeBSD không phải là Bash.

Có cách nào tôi có thể chạy các tập lệnh Bash đó mà không sửa đổi nó không? Vì vậy, không có sửa đổi cho các #!/bin/shtuyên bố trong tập tin kịch bản để chỉ ra một nơi khác?

Tôi muốn chạy Bash script máng Zsh, nếu có thể. Không muốn cài đặt Bash và vì Zsh có thể chạy các tập lệnh Bash ...



Nói "Tôi muốn chạy bashtập lệnh mà không cần cài đặt bash" tương đương với câu "Tôi muốn chạy tập lệnh Python mà không cần cài đặt Python". Nếu đó là một bashtập lệnh, nó sẽ được thực thi bằng bashtrình thông dịch.
Kusalananda

Câu trả lời:


5

Bạn có thể gọi shell yêu thích của bạn với kịch bản là một tham số.

bash ./script.sh

1
"Đừng muốn cài đặt Bash" - OP không muốn chạy bash.
Mat

1
cũng có thể là zsh, đó là lý do tại sao tôi đã viết "vỏ yêu thích"
bắt đầu từ

Nhưng, mà không gọi chương trình bash (hoặc zsh) với một tập lệnh làm đối số? Trong phương sách cuối cùng, tôi có thể làm điều đó, nhưng ./filetoexecute.shviết nhanh hơn, bash filetoexecute.shhoặc zsh filetoexecute.sh. Ngoài ra, Lạ theo cách bạn nói ... bash ./s Something ... Chưa bao giờ thấy ai đó sử dụng ./ làm đối số
user1115057

Một tùy chọn khác là sửa đổi hệ thống của bạn để cài đặt zsh là / bin / sh.
bắt đầu

@arved Tất nhiên, sau khi bạn đã chắc chắn rằng thay đổi này không phá vỡ bất kỳ tập lệnh hệ thống nào .
Kusalananda

3

Tôi tự chạy FreeBSD. Tôi thấy rằng bắt đầu tập lệnh với những điều sau đây cải thiện đáng kể khả năng tương thích hệ điều hành chéo:

#!/usr/bin/env bash

Mặc dù điều đó là chính xác và hữu ích khi viết một kịch bản mới, nó không thực sự trả lời câu hỏi ở đây. OP đã hỏi một cách rõ ràng về một giải pháp mà các tệp đã có sẵn không cần phải chỉnh sửa trước khi chúng có thể được sử dụng.
Adaephon

2

Bạn yêu cầu sửa bạn khi bạn sai. Tôi sẽ thử:

  • Kịch bản Linux được viết bằng bash : Vâng, một số được viết cho bash, một số khác cho dashvà hy vọng một uống nhiều cho bất kỳ vỏ POSIX-compliant.
  • Tập lệnh Bash thường #! / Bin / sh Nếu họ dựa vào các bashtính năng không chuẩn , rất khuyến khích có một #!/bin/bashshebang
  • Trong GNU / Linux, / bin / sh là Bash Điều đó phụ thuộc vào phân phối. Nó cũng có thể dashhoặc mkshtrên Debian chẳng hạn.
  • Trong FreeBSD, / bin / sh không phải là bash, đó là sh thực sự . Có rất nhiều shtriển khai. Cái nào là đúng"? Trên FreeBSD, shđược dựa trên shell Almquist như dashhoặc NetBSD sh. Trên OpenBSD, nó dựa trên pdksh, trên nhiều Unice thương mại, nó dựa trên ksh88 (là cơ sở cho shđặc tả Unix / POSIX ). Một số ksh88shell dựa trên và bashlà hai shell duy nhất được chứng nhận là shtriển khai tuân thủ Unix (khi được xây dựng với các cờ phù hợp và khi ở trong môi trường phù hợp).

Nếu bạn có tập lệnh với /bin/shshebang và muốn chúng được thực thi bởi zshbạn có thể thử chuyển tập lệnh tới zsh, nhưng điều này sẽ thất bại ngay khi tập lệnh này gọi tập lệnh khác (và bạn không muốn sửa đổi tập lệnh).

Vì vậy, tôi chỉ thấy khả năng có một liên kết tượng trưng từ /bin/shđến của bạn zsh. Nhưng tôi không khuyên bạn nên làm điều này , vì nó có thể có tác động mạnh mẽ đến thời gian khởi động của bạn và thậm chí sẽ không giúp bạn cho một số tập lệnh linux của bạn.


Lưu ý rằng trong khi tôi sẽ không khuyên bạn nên cài đặt zshnhư /bin/shmột trong hai, nó có thể không ảnh hưởng thời gian khởi động mà quyết liệt. Nhờ thiết kế mô-đun, nó gọn gàng hơn bash. Nó cũng thường nhanh hơn bashvà có một số tối ưu hóa mà một số vỏ khác nhanh hơn / nhanh hơn như dashkhông có (như tối ưu hóa một số dĩa). Tuy nhiên, trên FreeBSD, việc thay đổi sh thành bash hoặc zsh thực sự sẽ ảnh hưởng đến hiệu suất.
Stéphane Chazelas

@ StéphaneChazelas Cảm ơn bạn đã chỉnh sửa và làm rõ điều này. Đó là điều tôi muốn nói: Không phải zshthay vì bash, mà thay vào đó là một đoạn mã nhanh. Một vấn đề khác chưa được giải quyết ở đây là các tập lệnh cho linux và chưa được thử nghiệm ở bất kỳ nơi nào khác có thể sử dụng các phần mở rộng GNU trên các công cụ tiêu chuẩn. Vì vậy, ngay cả việc cài đặt bashcũng không giúp được gì.
Philippos

0

Nếu bạn thực sự muốn chạy Linux dựa kịch bản được viết bằng /bin/bashtrong FreeBSD mà không sửa đổi chúng, sau đó bạn chỉ có thể sao chép /usr/local/bin/bashđể /bin/bashở FreeBSD và nó sẽ làm việc.


1
Một symlink sẽ tốt hơn. Nếu không, / bin / bash sẽ không tự động được cập nhật khi / usr / local / bin / bash được cập nhật.
Stéphane Chazelas
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.