Chạy tập lệnh bash từ trình bao zsh


11

Tôi đang gặp vấn đề khi chạy tập lệnh bash zsh. Kịch bản tương tự như đoạn bên dưới và được cho là chạy theo bash:

#!/bin/bash
echo "<235234>"  | egrep -oe [0-9]+

Tuy nhiên, shell của tôi theo mặc định là trên zsh, vì vậy để chạy đoạn script trên, những gì tôi làm là gõ /bin/bashvào zshdấu nhắc của tôi và sau đó tôi chạy . script.sh.

Tuy nhiên, điều này dẫn đến một lỗi và tôi nhận được:

zsh: no matches found: [0-9]+

(Tôi nên nhận 235234thay thế).

Tại thời điểm này tôi bối rối và có những câu hỏi sau:

  1. Nếu tôi đang ở bash, tại sao tôi nhận được một lỗi được báo cáo bởi zsh?
  2. Tại sao egrepregrec thất bại? Biểu thức chính quy có vẻ đúng với tôi.

Lưu ý: Trong trường hợp có vấn đề, tôi không phải sửa đổi tập lệnh (tập lệnh được chia sẻ bởi nhiều người dùng và chúng tôi không có nghĩa vụ phải thay đổi tập lệnh).

Cảm ơn

Câu trả lời:


19

Nếu tập lệnh bắt đầu đúng với #!/bin/bash(bạn không thể có một nhận xét khác trước đó), bạn chỉ cần thực hiện nó bằng cách gõ /path/to/script.sh, mà không cần .vào lúc đầu. Đây .là một câu lệnh bao gồm, điều đó có nghĩa là có thể thực hiện các nội dung của tệp này như thể nó đã được gõ ở đây trên dòng lệnh (đây được gọi là Tìm kiếm nguồn cung cấp trong thuật ngữ shell unix).

Chạy bash và tìm nguồn cung cấp kịch bản nên hoạt động. Tôi đoán rằng vì bạn đã bash tự động bắt đầu trong một số trường hợp, nhưng bạn thích zsh hơn, bạn đã thiết lập bash để tự động chuyển sang zsh - có thể với exec zshbạn ~/.bashrc. Đừng làm vậy: thay vào đó, bạn nên chuyển sang zsh trong tệp được thực thi khi bạn đăng nhập, tức là ~/.profilevà để .bashrcyên. Để zshđược thực thi trong các thiết bị đầu cuối, hãy đặt SHELLbiến môi trường:

# in ~/.profile
export SHELL=/bin/zsh
if [ -t 1 ]; then exec $SHELL; fi

Thật không may là bạn không thể sửa đổi tập lệnh, vì nó có lỗi. Các dấu ngoặc nên được trích dẫn, ngay cả trong bash. Nếu có một tệp được gọi 3+trong thư mục hiện tại, lệnh gọi egrepsẽ tìm kiếm một hoặc nhiều lần xuất hiện của chữ số 3thay vì một chuỗi các chữ số tùy ý. Nếu có một tệp được gọi 3+và một tệp được gọi 4+, lệnh gọi egrepsẽ tìm kiếm 3s trong tệp 4+. Ở đây, sự khác biệt giữa bash và zsh chỉ phát huy khi không có tệp nào khớp với mẫu được cung cấp: bash âm thầm chạy lệnh với mẫu không được phân loại, trong khi zsh báo lỗi (theo mặc định).


Cảm ơn @Guilles. Điều này rất hữu ích. Điều kỳ lạ là tôi không có exec zshtrên tôi ~/.bashrc, cũng không có ~/.profile(tôi thậm chí không có .profiletrong thư mục nhà của tôi). Tôi không nhớ làm thế nào tôi quản lý để tạo zshvỏ mặc định của tôi. Ngoài ra, xin lỗi vì sự nhầm lẫn, nhưng dòng đầu tiên trong kịch bản của tôi là shebang #!/bin/bash. Với điều này, tôi vẫn không biết tại sao tìm nguồn cung cấp tệp từ zshkhông hoạt động (nếu bạn có bất kỳ suy nghĩ nào về việc này hãy cho tôi biết). Trong cả hai trường hợp, tôi sẽ liên hệ với quản trị viên để cập nhật tập lệnh mặc dù để thêm dấu ngoặc kép vào biểu thức chính quy.
Amelio Vazquez-Reina

Vấn đề với việc tìm nguồn cung ứng trong zsh là đối số thứ hai egrep.
Ignacio Vazquez-Abrams
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.