Tại sao mkdir không thành công (không có tệp hoặc thư mục như vậy) trong tập lệnh có BIN_DIR = khăn ~ / bin / mật?


Câu trả lời:


10

Thông báo lỗi được tạo vì dấu ngã ~được trích dẫn, như được mô tả trong câu trả lời của Zanna . Nếu bạn muốn sử dụng ~, phần có liên quan của tập lệnh phải là:

BIN_DIR=~/bin/

Nếu vì lý do nào bạn muốn trích dẫn chuỗi, bạn có thể sử dụng biến môi trường $HOME:

BIN_DIR="$HOME/bin/"

Theo tôi cách tiếp cận thứ hai là thực hành tốt hơn.


6
Không có gì sai khi sử dụng ~trong các kịch bản. nó hoạt động chính xác theo cách tương tự như trong dòng lệnh. Vấn đề là trích dẫn khối mở rộng dấu ngã như được giải thích trong câu trả lời của Zanna .
terdon

@terdon, tôi đồng ý. Nhưng tôi đã không nói có điều gì đó sai, nhưng đó là một ý tưởng tốt hơn, bởi vì bạn nên chú ý ít hơn.
pa4080

5
Nhưng hoàn toàn không có sự khác biệt giữa dòng lệnh và tập lệnh ở đây. Thực tế là điều này trong một kịch bản là hoàn toàn không liên quan, bạn sẽ có chính xác cùng một lỗi trong dòng lệnh. Vấn đề là trích dẫn, không phải trong một kịch bản.
terdon

Mặc dù điều đó hoàn toàn đúng nhưng cũng đúng khi sử dụng $HOMEtrong các kịch bản là một ý tưởng tốt.
tráng miệng

3
@ pa4080 Bạn có thể thêm một lời giải thích về lý do tại sao bạn nghĩ mở rộng $HOMEtốt hơn là sử dụng mở rộng dấu ngã không? Lời giải thích duy nhất bạn đưa ra là nói, "đó là một ý tưởng tốt hơn, bởi vì bạn nên chú ý ít hơn." Tôi không có ý tưởng gì đó có nghĩa. Bạn có thể giải thích về nó trong một chỉnh sửa? Không có nó, không có gì hỗ trợ câu trả lời của bạn, vì vậy chắc chắn nó thuộc về nó. Hiện tại , POSIX đã được POSIX yêu cầu mở rộng dòng hashbang của tập lệnh là #!/bin/bashvì vậy tôi cho rằng tính di động không phải là lý do.
Eliah Kagan

23

Nó không hoạt động vì ~được trích dẫn. Báo giá kép " ngăn chặn mở rộng dấu ngã . Không có thư mục với tên theo nghĩa đen ~/bin. Như đã giải thích trong man bash(nhấn mạnh của tôi):

Mở rộng Tilde

Nếu một từ bắt đầu bằng ký tự dấu ngã không được trích dẫn (`~ '), tất cả các ký tự đứng trước dấu gạch chéo không được trích dẫn đầu tiên (hoặc tất cả các ký tự, nếu không có dấu gạch chéo không được trích dẫn) sẽ được coi là tiền tố dấu ngã. Nếu không có ký tự nào trong tiền tố dấu ngã được trích dẫn, thì các ký tự trong tiền tố dấu ngã sau dấu ngã được coi là tên đăng nhập có thể. Nếu tên đăng nhập này là chuỗi null, dấu ngã được thay thế bằng giá trị của tham số shell HOME. Nếu HOME không được đặt, thư mục chính của người dùng thực thi shell được thay thế. Mặt khác, tiền tố dấu ngã được thay thế bằng thư mục chính được liên kết với tên đăng nhập được chỉ định.

Bạn có thể xóa dấu ngoặc kép , vì ~là ký tự duy nhất trong đường dẫn ~/binsẽ khiến trình bao thực hiện mở rộng và chúng tôi muốn mở rộng trong trường hợp này. Shell sẽ không thực hiện bất kỳ mở rộng nào nữa về kết quả của việc mở rộng dấu ngã, ít nhất là trong Bash 4 , tất cả các bản phát hành Ubuntu hiện tại hoặc từ xa gần đây đều có . Vì vậy, ngay cả khi thư mục chính của bạn chứa các ký tự bất thường như dấu cách, nó vẫn ổn.

Hoặc bạn có thể sử dụng $HOMEthay vì của ~, bởi vì mở rộng tham số không bị ức chế bởi dấu ngoặc kép, chỉ bằng dấu nháy đơn . Các dấu ngoặc kép làm đảm bảo rằng giá trị mở rộng không phải là bản thân phụ thuộc vào bất kỳ mở rộng hơn nữa, vì vậy tách từ hoặc mở rộng tên tập tin sẽ không xảy ra. Vì vậy, $HOMElàm việc ngay cả với các thư mục nhà được đặt tên kỳ lạ, miễn là bạn giữ dấu ngoặc kép.


Theo tuyên bố này "mở rộng tham số không bị triệt tiêu bởi dấu ngoặc kép, chỉ bằng dấu ngoặc đơn" : đầu ra của cd '~'-bash: cd: ~: No such file or directory.
pa4080

2
@ pa4080 Mở rộng ~không phải là một phần của mở rộng tham số.
Barmar
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.