shopt hoạt động trong dòng lệnh, không được tìm thấy khi chạy trong một kịch bản


13

Tôi đang viết một tập lệnh để sao chép một số tệp xung quanh và cố gắng sử dụng shopt -s dotglob để cho phép cp sao chép các tệp dotfiles như .jshintvà không có gì.

Tôi có thể chạy shopt -s dotglobtrực tiếp tại một dấu nhắc bash mà không có lỗi. Tuy nhiên, chạy tập lệnh sẽ ném lỗi:

script.sh: 81: script.sh: shopt: not found

Tôi đang chạy tập lệnh này trong bash shell, với tiêu đề shebang #!/usr/bin/env bash. Dòng lỗi:

shopt -s dotglob
cp -r $TEMP/img/* $TARGET/img/
cp -r $TEMP/js/* $TARGET/js/
cp -r $TEMP/less/* $TARGET/less/

Không tìm thấy bất cứ điều gì hữu ích trên google, bất kỳ ý tưởng vấn đề là gì ở đây?


Cảm ơn đã nhắc nhở, lựa chọn câu trả lời cho tất cả những gì tôi có thể. Vẫn còn một câu hỏi bên cạnh câu hỏi chưa có câu trả lời hay.
Kurtosis

3
Thử với #!/bin/bashtiêu đề đơn giản hơn ?
ish

Và phiên bản Ubuntu nào?
ish

2
@izx, đó là câu trả lời đúng, shoptlà một bash dựng sẵn, shkhông có shoptvà thông báo lỗi trông giống như một thông báo lỗi từ dash. Vì vậy, rất có thể lỗi ở đây là chạy tập lệnh bash với sh( dashtheo mặc định trong Ubuntu ). Ngay cả khi shlà một liên kết tượng trưng đến bash, việc chạy một tập lệnh bash shkhông giống như chạy nó với bash.
geirha

Câu trả lời:


22

Để tạo một câu trả lời từ các ý kiến:

Nhiều người theo thói quen chạy kịch bản của họ với shthay vì bash. Đây là một thực tiễn tốt nếu tính di động là một mối quan tâm, nhưng nhiều người làm như vậy bởi vì họ đang sao chép một cái gì đó họ đã thấy mà không hiểu nó.

Trừ khi tập lệnh của bạn cần chạy trên hệ thống Linux không dành cho máy tính để bàn (ví dụ: chạy tập lệnh shell trên thiết bị Android khá khác nhau), tôi khuyên bạn nên sử dụng dòng Bash shebang ở đầu:

#!/bin/bash

Dòng này, khi nó là dòng đầu tiên trong tập lệnh, xác định trình thông dịch nào (shell như bash hoặc sh, Python, v.v.) được gọi để thực thi nó. Nếu bạn sử dụng dòng trên, bạn sẽ có hành vi tương tự (gần như) như bạn làm từ dòng lệnh, giả sử bạn sử dụng shell mặc định. Nếu vì lý do tính di động hoặc ưu tiên bạn sử dụng một dòng shebang khác, hãy lưu ý rằng bạn sẽ phải tham khảo tài liệu về trình bao bạn đã tham chiếu, ngay cả khi trình bao bạn tham chiếu là liên kết tượng trưng đến Bash.


5
Để hoàn toàn có hệ thống chéo, tôi thích: #!/usr/bin/env bash vì đó là công việc của env để biết nên sử dụng bash nào (ví dụ trong trường hợp bạn đã vá nó).
shrikeh

-1

Bạn cần thoát zsh và kích hoạt bash như hình:

exec bash

Lệnh chạy

source ~/.bashrc

Sau đó, bạn có thể phản ứng zsh:

exec zsh

Mong rằng sẽ giúp


Hừm. 1) Tôi không nghĩ OP đã sử dụng zsh, 2) AFAIK ~/.basrcđược điều hành bởi bash khi khởi động trong trường hợp này vì vậy không cần phải gọi nó một cách rõ ràng, 3) Lệnh OP được thực thi ở đâu? và 4) sử dụng exechai lần khiến bạn mất bất kỳ thay đổi môi trường nào bạn đã thực hiện trong trình bao zsh ban đầu, điều này sẽ không xảy ra nếu bạn chỉ gọi bash.
xenoid

Trong trường hợp của tôi, cần phải nhận các thay đổi môi trường và các thay đổi vẫn tồn tại. Tôi vừa khởi động lại máy tính và mọi thay đổi của tôi vẫn tồn tại. Có lẽ nó chỉ dành riêng cho Anaconda mà tôi đã cố gắng thiết lập mặc dù
David Kabii
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.