Vì OP không cung cấp tập lệnh mẫu nên tôi sẽ tạo một tập lệnh. Nó sẽ làm một việc. Chạy ls
trong thư mục của tập lệnh.
Vâng, tôi biết bạn chỉ có thể làm ls
không có ./
. Nhưng đối với ví dụ này, tôi giả vờ rằng nó là bắt buộc, để minh họa một tập lệnh sử dụng thư mục hiện tại của tập lệnh.
#!/usr/bin/env bash
ls ./
Lưu tập lệnh đó ở đâu đó. tôi sẽ lưu nó dưới dạng /home/ubuntu/test/myscript
. Làm cho nó có thể thực thi được với chmod +x /home/ubuntu/test/myscript
. Hiện nay đĩa CD
đến thư mục chứa tập lệnh (ví dụ: cd /home/ubuntu/test
) và chạy tập lệnh với ./myscript
:
ubuntu@computer:~/test$ ./myscript
myscript someRandomFile
Càng xa càng tốt. Nhưng bây giờ hãy chạy nó từ một thư mục khác. Trong ví dụ này, tôi sẽ chạy nó từ thư mục gốc (/
).
ubuntu@máy tính:~/test$ cd /
ubuntu@computer:/$ /home/ubuntu/test/myscript
bin dev home lib lib64 bị mất + tìm thấy mnt proc chạy snap sys usr
khởi động, v.v. init lib32 libx32 media opt root sbin srv tmp var
Ối. Chúng tôi muốn nó in các tệp ở vị trí của tập lệnh chứ không phải vị trí của người dùng. Trước khi tìm ra giải pháp, hãy nghĩ về tại sao nó làm điều này trong một thời điểm. Đáp án đơn giản. ./
là tương đối so với của người dùng thư mục hiện tại, không phải là thư mục của tập lệnh.
Để lấy thư mục của tập lệnh từ bên trong tập lệnh, chúng ta sẽ xem xét câu hỏi Stack Overflow này.
Ý chính của nó rất đơn giản: script_dir="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
sẽ lấy thư mục hiện tại của tập lệnh và lưu trữ nó trong biến script_dir
.
Hãy cập nhật kịch bản cho phù hợp. Kịch bản của chúng tôi bây giờ là thế này:
#!/usr/bin/env bash
script_dir="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
ls "$script_dir"
Hãy chạy nó và xem nó có hoạt động không:
ubuntu@computer:/$ /home/ubuntu/test/myscript
myscript someRandomFile
Nó hoạt động! Nó in các tệp trong thư mục của tập lệnh, ngay cả khi bạn không ở cùng thư mục với tập lệnh, Chúng ta đã hoàn tất. Ý tưởng tổng thể là đơn giản. Trong kịch bản, ./
đề cập đến thư mục của người dùng. "$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
đề cập đến thư mục chứa tập lệnh. Hãy cập nhật tập lệnh của bạn cho phù hợp và tập lệnh sẽ hoạt động.