bash script source: Không có tập tin hoặc thư mục như vậy


9

Tôi có một kịch bản bắt đầu như thế này

#!/bin/bash
VALKYRIE=~/myProjects/valkyrie
source $VALKYRIE/cluster.conf

nhưng khi tôi chạy nó sẽ trả về line 2: ~/myProjects/valkyrie/cluster.conf: No such file or directory

nhưng tập tin tồn tại và khi tôi chạy source ~/myProjects/valkyrie/cluster.confnó chạy tốt. Bất kỳ ý tưởng? Tôi đặt VALKYRIEbiến ở nơi khác để mã cứng trong đường dẫn không phải là một tùy chọn.


Tôi không chắc chắn 100% nếu điều này có ích, nhưng bạn có thể thử trích dẫn đầy đủ biến, trong trường hợp có khoảng trắng trong ~. Do đó , source "${VALKYRIE}/cluster.conf".
Sparhawk

không, nó không có ích
Khôi

1
Tôi nghĩ rằng đó là một cái gì đó để làm với việc ~không mở rộng đúng cách. Khi tôi chạy tập lệnh của bạn với một đường dẫn giả có chủ ý, lỗi không nói ~, nhưng mở rộng đường dẫn. Bạn có thể thử thay thế ~trong tập lệnh của bạn bằng đường dẫn tuyệt đối không? Ngoài ra, hãy thử chạy sau đây trong một kịch bản echo ~.
Sparhawk

2
Bạn cũng có thể thử $HOMEthay vì ~.
Sparhawk

3
@Khoi Điều đó giải thích nó. ~/.pam_environmentkhông phải là tập lệnh shell, vì vậy nó không thực hiện những điều phổ biến mà bạn mong đợi từ trình bao, chẳng hạn như mở rộng dấu ngã và mở rộng tham số, do đó, ~cũng không $HOMEđược thay thế. Nếu bạn di chuyển dòng đó để ~/.profilethay thế, và thêm export vào phía trước, nó sẽ hoạt động.
geirha

Câu trả lời:


8

~dường như không được mở rộng đúng cách. Khi tôi chạy tập lệnh của bạn với đường dẫn giả có chủ ý, lỗi không nói ~, nhưng mở rộng đường dẫn (nghĩa là /home/sparhawk/fakepathkhông ~/fakepath. Bạn có thể thử sử dụng $HOMEthay vì ~hoặc sử dụng đường dẫn đầy đủ trong tập lệnh thay thế.

(Tôi không chắc tại sao ~không hoạt động trên hệ thống của bạn, vì tập lệnh của bạn hoạt động tốt với tôi.)


Khi bạn xem thứ tự bash thực hiện mở rộng ( gnu.org/software/bash/manual/bashref.html#Shell-Expansions ), bạn sẽ thấy việc mở rộng dấu ngã xảy ra trước khi mở rộng biến. Đó là lý do tại sao $HOMEtốt hơn ~trong một biến
glenn jackman

@glennjackman Tôi không chắc là tôi hiểu. Tại sao ưu tiên cho các biến so với ~?
Sparhawk

1
nó không chính xác là "ưu tiên", nó chỉ đơn giản là những gì đến trước. Hãy xem xét x="~/.bashrc"; ls $x- theo thứ tự mở rộng cho lệnh "ls", bash tìm dấu ngã và không tìm thấy dấu; cuối cùng bash nhìn thấy một biến và mở rộng nó. Bash không quay trở lại và tìm kiếm dấu ngã một lần nữa, tại thời điểm này, nó chỉ là một nhân vật đơn giản. và không có tệp nào trong thư mục hiện tại bắt đầu bằng dấu ngã.
glenn jackman

À được rồi. Tôi nghĩ rằng tôi nhận được nó. Tôi đã luôn tự hỏi tại sao lệnh đó thất bại và x=~/".bashrc"; ls $xhoạt động. Cảm ơn bạn về thông tin.
Sparhawk
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.